jpg imagenes imagen guardar desde crear con java text png javax.imageio

java - desde - guardar imagenes en netbeans



¿Cómo puedo guardar un PNG con un fragmento tEXt o iTXt de Java? (6)

Actualmente estoy usando javax.imageio.ImageIO para escribir un archivo PNG. Me gustaría incluir un fragmento de texto (y, de hecho, cualquiera de los fragmentos que se enumeran aquí ), pero no veo ningún medio de hacerlo.

Por el aspecto de com.sun.imageio.plugins.png.PNGMetadata, debería ser posible.

Debería estar muy agradecido por cualquier pista o respuesta.

METRO.


Pruebe la biblioteca Sixlegs Java PNG ( http://sixlegs.com/software/png/ ). Afirma tener soporte para todos los tipos de fragmentos y maneja los fragmentos privados.


Hacemos esto en el proyecto JGraphX . Descargue el código fuente y eche un vistazo al paquete com.mxgraph.util.png, allí encontrará tres clases de codificación que copiamos de las fuentes de Apache Batik. Un ejemplo de uso es en com.mxgraph.examples.swing.editor.EditorActions en el método saveXmlPng. Un poco editado, el código se ve así:

mxPngEncodeParam param = mxPngEncodeParam .getDefaultEncodeParam(image); param.setCompressedText(new String[] { "mxGraphModel", xml }); // Saves as a PNG file FileOutputStream outputStream = new FileOutputStream(new File( filename)); try { mxPngImageEncoder encoder = new mxPngImageEncoder(outputStream, param); if (image != null) { encoder.encode(image); } } finally { outputStream.close(); }

Donde imagen es la Imagen Buffered que formará el .PNG y xml es la cadena que deseamos colocar en la sección iTxt. "mxGraphModel" es la clave para esa cadena xml (la sección comprende un cierto número de pares clave / valor), obviamente usted reemplaza eso con su clave.

También en com.mxgraph.util.png, hemos escrito una clase muy simple que extrae el iTxt sin procesar toda la imagen. Puede aplicar la misma idea para el fragmento tEXt utilizando mxPngEncodeParam.setText en lugar de setCompressedText (), pero la sección de texto comprimido permite secciones de texto considerablemente mayores.


Me doy cuenta de que hace tiempo que respondí esta pregunta, pero si quieres hacerlo sin sumergirte en la jerarquía de "com.sun", aquí hay un ejemplo rápido y muy feo, ya que no pude encontrar esto documentado en ningún otro lado.

BufferedImage img = new BufferedImage(300, 300, BufferedImage.TYPE_INT_ARGB); // Create a DOM Document describing the metadata; // I''ve gone the quick and dirty route. The description for PNG is at // [http://download.oracle.com/javase/1.4.2/docs/api/javax/imageio/metadata/doc-files/png_metadata.html][1] Calendar c = Calendar.getInstance(); String xml = "<?xml version=''1.0''?><javax_imageio_png_1.0><tIME year=''"+c.get(c.YEAR)+"'' month=''"+(c.get(c.MONTH)+1)+"'' day=''"+c.get(c.DAY_OF_MONTH)+"'' hour=''"+c.get(c.HOUR_OF_DAY)+"'' minute=''"+c.get(c.MINUTE)+"'' second=''"+c.get(c.SECOND)+"''/><pHYs pixelsPerUnitXAxis=''"+11811+"'' pixelsPerUnitYAxis=''"+11811+"'' unitSpecifier=''meter''/></javax_imageio_png_1.0>"; DOMResult domresult = new DOMResult(); TransformerFactory.newInstance().newTransformer().transform(new StreamSource(new StringReader(xml)), domresult); Document document = dom.getResult(); // Apply the metadata to the image ImageWriter writer = (ImageWriter)ImageIO.getImageWritersBySuffix("png").next(); IIOMetadata meta = writer.getDefaultImageMetadata(new ImageTypeSpecifier(img), null); meta.setFromTree(meta.getMetadataFormatNames()[0], document.getFirstChild()); FileOutputStream out = new FileOutputStream("out.png"); writer.setOutput(ImageIO.createImageOutputStream(out)); writer.write(new IIOImage(img, null, meta)); out.close();


Usando Java 1.6, edité el código de Mike para

Node document = domresult.getNode();

en lugar de su línea

Document document = dom.getResult();

Además, sugiero agregar una línea

writer.dispose()

después de que se haya realizado el trabajo, para que se liberen todos los recursos en poder del escritor.


La solución que encontré después de la descompilación, es la siguiente ...

RenderedImage image = getMyImage(); Iterator<ImageWriter> iterator = ImageIO.getImageWritersBySuffix( "png" ); if(!iterator.hasNext()) throw new Error( "No image writer for PNG" ); ImageWriter imagewriter = iterator.next(); ByteArrayOutputStream bytes = new ByteArrayOutputStream(); imagewriter.setOutput( ImageIO.createImageOutputStream( bytes ) ); // Create & populate metadata PNGMetadata metadata = new PNGMetadata(); // see http://www.w3.org/TR/PNG-Chunks.html#C.tEXt for standardized keywords metadata.tEXt_keyword.add( "Title" ); metadata.tEXt_text.add( "Mandelbrot" ); metadata.tEXt_keyword.add( "Comment" ); metadata.tEXt_text.add( "..." ); metadata.tEXt_keyword.add( "MandelbrotCoords" ); // custom keyword metadata.tEXt_text.add( fractal.getCoords().toString() ); // Render the PNG to memory IIOImage iioImage = new IIOImage( image, null, null ); iioImage.setMetadata( metadata ); // Attach the metadata imagewriter.write( null, iioImage, null );


Una vieja pregunta, pero ... PNGJ da el control total para leer y escribir fragmentos PNG