PNG - Ist es möglich, die Palette mit Java 2D zu reduzieren?
-
27-10-2019 - |
Frage
Wenn ich ein PNG -Bild als gepufferter Abschluss geöffnet habe, ist es möglich, die Palette im PNG -Bild so zu reduzieren, dass weniger Farbe (weniger Bits pro Pixel / Farbtiefe) vorhanden ist?
Zum Beispiel, wenn Sie sich ansehen Farbtiefe In Wikipedia möchte ich 16 Farben in meinem PNG -Bild (3. Bild auf der rechten Seite) verwenden.
Wenn es mit Java 2D nicht möglich ist, gibt es eine Bibliothek, die es mir ermöglicht, dies effektiv zu tun?
Lösung
Ich denke, Martijn Courtox hatte Recht:
Hier ist beispielsweise Implementierung:
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.awt.image.IndexColorModel;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
public class ImagingTest2 {
public static void main(String[] args) throws IOException {
BufferedImage src = ImageIO.read(new File("in.png")); // 71 kb
// here goes custom palette
IndexColorModel cm = new IndexColorModel(
3, // 3 bits can store up to 8 colors
6, // here I use only 6
// RED GREEN1 GREEN2 BLUE WHITE BLACK
new byte[]{-100, 0, 0, 0, -1, 0},
new byte[]{ 0, -100, 60, 0, -1, 0},
new byte[]{ 0, 0, 0, -100, -1, 0});
// draw source image on new one, with custom palette
BufferedImage img = new BufferedImage(
src.getWidth(), src.getHeight(), // match source
BufferedImage.TYPE_BYTE_INDEXED, // required to work
cm); // custom color model (i.e. palette)
Graphics2D g2 = img.createGraphics();
g2.drawImage(src, 0, 0, null);
g2.dispose();
// output
ImageIO.write(img, "png", new File("out.png")); // 2,5 kb
}
}
Andere Tipps
Erstellen Sie eine neue Bufferedimage mit der unteren Palette und verwenden Sie createGraphic()
A erwerben a Graphics2D
Objekt. Zeichnen Sie das Originalbild in die Grafik. dispose()
Die Grafik und hier sind Sie.
BufferedImage img = new BufferedImage(orig.getWidth(), orig.getHeight(),
BufferedImage.TYPE_USHORT_555_RGB);