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:
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...
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:
Java:
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
Java:
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...