Écrire dpi métadonnées d'une image jpeg en Java
Je suis en train d'en programmant définissez la résolution sur les métadonnées d'une image jpeg en Java. La source de l'image est un scanner, donc je me la résolution horizontal/vertical à partir de TWAIN, avec l'image des données brutes. J'aimerais enregistrer cette info pour de meilleurs résultats d'impression.
Voici le code que j'ai jusqu'ici. Il enregistre l'image raw (byteArray) à un fichier JPEG, mais il ignore le X/Ydensity information, je précise dans IIOMetadata. Tous les conseils de ce que je fais mal?
Toute autre solution (à la troisième partie de la bibliothèque, etc) serait le bienvenu.
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;
}
Merci!
OriginalL'auteur dasp | 2008-10-24
Vous devez vous connecter pour publier un commentaire.
Certaines questions qui n'ont pas été considérés ici:
L'arbre n'est pas directement mappés à la IOMetaData. Pour appliquer des données à partir de l'arbre, ajouter l'issue d'un appel après le réglage de la densité et de raster paramètres:
ne pas utiliser les méta-données comme premier paramètre de l'appel d'écriture. Voir
JPEGImageWriter#write(IIOMetaData, IIOImage, ImageWriteParam)
. Si streamMetaData n'est pas NULLE, un avertissement (WARNING_STREAM_METADATA_IGNORED) sera généré.définir les méta-données comme
IOMetadata
de laIOImage
. Ces méta-données sont utilisées par JPEGImageWriter. Le bon appel d'écriture est alorsOui, il est en fait bufferedImage. Christoph doit avoir copie-collé le bout de code et j'ai oublié de le modifier.
OriginalL'auteur
J'semblerait qu'il pourrait être un bug.
J'ai trouvé ce post à partir de quelques recherches google
Apparemment, il ya beaucoup plus qui pointent vers un bug.
Le post ci-dessus témoigne de l'utilisation de JMagick comme un tiers contourner.
OriginalL'auteur branchgabriel