In java, wie du schreibst ein java.das awt.Bild.BufferedImage in ein 8-bit-png-Datei?
Ich versuche zu schreiben, die eine png-Datei aus einem java.das awt.Bild.BufferedImage. Alles funktioniert gut, aber die resultierende png ist ein 32-bit-Datei.
Gibt es eine Möglichkeit, um die png-Datei 8-bit? Das Bild ist in Graustufen, aber ich brauche Transparenz, da dies ein overlay-Bild. Ich bin mit java 6, und ich würde es vorziehen, um eine Ausgabestrom so kann ich die aufrufende Klasse befassen sich mit dem schreiben der Datei auf die Festplatte/db.
Hier ist der relevante Teil des Codes:
public static ByteArrayOutputStream createImage(InputStream originalStream)
throws IOException {
ByteArrayOutputStream oStream = null;
java.awt.Image newImg = javax.imageio.ImageIO.read(originalStream);
int imgWidth = newImg.getWidth(null);
int imgHeight = newImg.getHeight(null);
java.awt.image.BufferedImage bim = new java.awt.image.BufferedImage(imgWidth,
imgHeight, java.awt.image.BufferedImage.TYPE_INT_ARGB);
Color bckgrndColor = new Color(0x80, 0x80, 0x80);
Graphics2D gf = (Graphics2D)bim.getGraphics();
//set transparency for fill image
gf.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.3f));
gf.setColor(bckgrndColor);
gf.fillRect(0, 0, imgWidth, imgHeight);
oStream = new ByteArrayOutputStream();
javax.imageio.ImageIO.write(bim, "png", oStream);
oStream.close();
return oStream;
}
- Werden können weitere Informationen gefunden werden können jetzt unter stackoverflow.com/questions/665406/...
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den build-in imageio png Schriftsteller schreiben 32-bit-png-Dateien auf allen Plattformen, die ich haben verwendet es auf, egal was die Quelle ist Bild. Sie sollten sich auch bewusst sein, dass viele Leute sich beschwert haben, dass die daraus resultierende Kompression, ist viel niedriger als das, was möglich ist, mit dem png-format. Es gibt mehrere unabhängige png-Bibliotheken zur Verfügung, die es Ihnen ermöglichen, um das genaue format, aber eigentlich habe ich nicht wirklich Erfahrung mit irgendwelchen von Ihnen.
Fand ich die Antwort auf die Frage, wie die Konvertierung PAR in den Indizierten hier: http://www.eichberger.de/2007/07/transparent-gifs-in-java.html
Jedoch, die resultierende 8-bit-png-Datei hat nur 100% oder 0% Transparenz. Sie könnte wahrscheinlich optimieren Sie die IndexColorModel arrays, aber wir haben uns entschieden, um die generierte Datei (was eine overlay-Maske) in einer Unterlage jpg und verwenden Sie, was war die statische Grundlage als transparentes overlay.
Es ist eine interessante Frage... Es ist spät, ich werde Experimentieren morgen. Ich werde zuerst versuchen, und verwenden Sie ein BufferedImage.TYPE_BYTE_INDEXED (vielleicht nach der Zeichnung), um zu sehen, wenn Sie Java intelligent genug, um zu erzeugen ein 8bit PNG.
Oder vielleicht einige Bild-Bibliothek erlauben.
[BEARBEITEN] Einige Jahre später... Eigentlich habe ich den code an der Zeit, aber vergessen, Sie zu aktualisieren dieses Threads... ich verwendet den code deutete auf von Kat, mit ein wenig Verfeinerung auf den Umgang mit Transparenz und speichern im format PNG statt Gif-format. Es funktioniert in so ein 8-bit-PNG-Datei mit dem alles-oder-nichts-Transparenz.
Finden Sie ein working test-Datei auf http://bazaar.launchpad.net/~philho/+junk/Java/view/head:/Tests/src/org/philhosoft/tests/image/AddTransparency.java
mit meinem ImageUtil Klasse.
Da der code ist nicht groß, für die Nachwelt Willen, poste ich es hier, ohne die JavaDoc zu speichern einige Zeilen.
Danke für Ihre Antwort, ich werde versuchen ein
TYPE_BYTE_INDEXED
mit einem IndexColorModel und vielleicht immer noch, aber wenn ImageIO schreibt 32-bit-unabhängig davon, scheint es, dass ich kann, meine Zeit zu verschwenden gibt.Dem Bild, das ich bin versucht zu schreiben, kann sehr groß sein (bis zu 8000x4000), sondern ist nur eine einfache Maske für das Bild darunter, so wird nur eine ~30% Grau-transparente und eine 100% transparente Aussparung. Würde ich ein GIF, aber IE6, der anscheinend Probleme mit der Anzeige eine, große.
Es wird nur einmal erstellt und in einer internen set-up-Bildschirm, so dass Leistung ist nicht ein Problem, entweder, aber es muss getan werden innerhalb des java-Codes und nicht durch eine offline-Dienstprogramm.
Bibliotheken, die Sie angegeben haben, kann verwendet werden, um es zu transformieren, während das schreiben... ich werde gehen, überprüfen Sie es heraus.
Wenn jemand eine bessere Art und Weise, lassen Sie es mich bitte wissen!!
Dank!