# Farbtiefenreduktion



## Maldito (8. Mai 2011)

Hi,
ich bin sicher nich der erste der das fragt, denoch fällt es mir schwer irgendetwas hilfreiches zu diesem Thema zu finden.
Also ich möchte ein von einem Bild (.png) die Farbtiefe reduzieren, von 24 bit auf 3 bit.
Jetzt doktore ich hier schon stundelang an meinem Code herum, und immer mal wieder ändert sich was, aber das gewüschte Ergebnis erreiche ich nie. Ein graues Quadrat wird violett(!) aber nich schwarz/weiss etc.

Also die Codeschnippsel an denen es m.E. hängen könnte sind die hier:


```
public void floydSteinberg(BufferedImage image) {	
		int height = image.getHeight();
		int width = image.getWidth();		
		int oldpixel;		
		Color newpixel;
		int quantError;
		boolean[][] alreadyQuantisized = new boolean[height][width];
		File output = changeName();
		for (int i = 0; i < height; ++i) {
			for (int j = 0; j < width; ++j) {					
				      oldpixel = image.getRGB(j, i);
					  int[] newRGB = splitRGB(j, i, image);					  
					  newpixel = new Color (newRGB[0], newRGB[1], newRGB[2]);					  
					  image.setRGB(j, i, newpixel.getRGB());		              
					  quantError = oldpixel - newpixel.getRGB();				
				      if (j < width  - 1 && !alreadyQuantisized[i][j+1]) {				    	 
				    	  image.setRGB(j + 1, i, (image.getRGB(j + 1, i) + 7 * quantError / 16));	
				    	  alreadyQuantisized[i][j+1] = true;
				      }//if
				      if (j > 0 & i < height - 1 && !alreadyQuantisized[i+1][j-1]) {
				    	  image.setRGB(j - 1, i + 1, (image.getRGB(j - 1, i + 1) + 3 * quantError / 16));
				    	  alreadyQuantisized[i+1][j-1] = true;
				      }//if
				      if (i < height - 1 && !alreadyQuantisized[i+1][j]) {
				    	  image.setRGB(j, i + 1, (image.getRGB(j, i + 1) + 5 * quantError / 16));
				    	  alreadyQuantisized[i+1][j] = true;
				      }//if
				      if (j < width - 1  & i < height - 1 && !alreadyQuantisized[i+1][j+1]) {
				    	  image.setRGB(j + 1, i + 1, (image.getRGB(j + 1, i + 1) + quantError / 16));	
				    	  alreadyQuantisized[i+1][j+1] = true;
				      }//if					
			}//for
		}//for		
		try {
		if (!ImageIO.write(image, "png", output)) {
			System.out.println("Unknown file format");
		}//if
		}//try
		catch (IOException e) {
			System.out.println("Unexpected Error");
		}
	}//floydSteinberg
```


```
private int[] splitRGB (int x, int y, BufferedImage image) {
		Color color = new Color(image.getRGB(x, y));
		int red = color.getRed();
		int green = color.getGreen();
		int blue = color.getBlue();
		red = (red + 128) / 256 * 255;
		green = (green + 128) / 256 * 255;
		blue = (blue + 128) / 256 * 255;
		int[] rgb = {red, green, blue};
		return rgb;
	}//splitRGB
```

Also ich erwarte hier wirklich von niemandem, dass er meinen Code durchgeht, aber ein Hinweis über die generelle Vorgehensweise, wäre schon nett. Bibliotheksklassen, die Verfahren zur Reduktion liefern sind übrigens tabu.

Hoffe es findet sich jemand der mir einen Tipp geben kann...


----------



## faetzminator (8. Mai 2011)

Maldito hat gesagt.:


> Ein graues Quadrat wird violett(!) aber nich schwarz/weiss etc.



Hab deinen Code nicht gelesen. Aber das wär kein Wunder, wenn der Blau- und Rotwert > 50% und der Grünwert < 50% wär, dann würde das IMHO violett ergeben.


----------



## Marco13 (8. Mai 2011)

Dieses deja vu hatte ich doch schonmal? http://www.java-forum.org/java-basics-anfaenger-themen/117768-farbreduktion.html


----------

