Estoy tratando de establecer programáticamente los metadatos de dpi de una imagen jpeg en Java. La fuente de la imagen es un escáner, por lo que obtengo la resolución horizontal/vertical de TWAIN, junto con los datos brutos de la imagen. Me gustaría guardar esta información para obtener mejores resultados de impresión.Escribir metadatos de dpi en una imagen jpeg en Java
Aquí está el código que tengo hasta ahora. Guarda la imagen sin procesar (byteArray) en un archivo JPEG, pero ignora la información X/Ydensity que especifico a través de IIOMetadata. ¿Algún consejo sobre lo que estoy haciendo mal?
Cualquier otra solución (biblioteca de terceros, etc.) también sería bienvenida.
import java.awt.image.BufferedImage;
import java.awt.image.WritableRaster;
import java.io.File;
import javax.imageio.IIOImage;
import javax.imageio.ImageIO;
import javax.imageio.ImageTypeSpecifier;
import javax.imageio.metadata.IIOMetadata;
import javax.imageio.plugins.jpeg.JPEGImageWriteParam;
import javax.imageio.stream.ImageOutputStream
import org.w3c.dom.Element;
import com.sun.imageio.plugins.jpeg.JPEGImageWriter;
public boolean saveJpeg(int[] byteArray, int width, int height, int dpi, String file)
{
BufferedImage bufferedImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
WritableRaster wr = bufferedImage.getRaster();
wr.setPixels(0, 0, width, height, byteArray);
try
{
// Image writer
JPEGImageWriter imageWriter = (JPEGImageWriter) ImageIO.getImageWritersBySuffix("jpeg").next();
ImageOutputStream ios = ImageIO.createImageOutputStream(new File(file));
imageWriter.setOutput(ios);
// Compression
JPEGImageWriteParam jpegParams = (JPEGImageWriteParam) imageWriter.getDefaultWriteParam();
jpegParams.setCompressionMode(JPEGImageWriteParam.MODE_EXPLICIT);
jpegParams.setCompressionQuality(0.85f);
// Metadata (dpi)
IIOMetadata data = imageWriter.getDefaultImageMetadata(new ImageTypeSpecifier(bufferedImage), jpegParams);
Element tree = (Element)data.getAsTree("javax_imageio_jpeg_image_1.0");
Element jfif = (Element)tree.getElementsByTagName("app0JFIF").item(0);
jfif.setAttribute("Xdensity", Integer.toString(dpi));
jfif.setAttribute("Ydensity", Integer.toString(dpi));
jfif.setAttribute("resUnits", "1"); // density is dots per inch
// Write and clean up
imageWriter.write(data, new IIOImage(bufferedImage, null, null), jpegParams);
ios.close();
imageWriter.dispose();
}
catch (Exception e)
{
return false;
}
return true;
}
¡Gracias!
Cuando se establece F_scaledImg? ¿Es lo mismo que imagen almacenada? Lo siento si esta es una pregunta tonta ... –
Sí, en realidad es una imagen amortiguada. Christoph debe haber copiado el fragmento y se olvidó de editarlo. – dasp