6 votes

Mise à l'échelle des images en Java

J'envoie des images dans un fichier PDF à l'aide d'iText. Les images apparaissent toujours plus grandes qu'elles ne sont censées l'être. Selon le livre (iText in Action), cela est dû au fait qu'iText affiche toujours les images à une résolution de 72 dpi, quelle que soit la propriété dpi réelle de l'image. Le livre suggère d'utiliser image.getDpiX() pour trouver le dpi de l'image, puis d'utiliser image.scalePercent(72 / actualDpi * 100) pour afficher l'image correctement. Jusqu'à présent, la propriété getDpiX() de toutes mes images a retourné 0 (j'ai essayé 2 gifs et 1 jpg). Existe-t-il un autre moyen de déterminer le DPI réel afin que mes images soient mises à l'échelle correctement ?

com.lowagie.text.Image graphic = com.lowagie.text.Image.getInstance(imgPath);
float actualDpi = graphic.getDpiX();
if (actualDpi > 0)
  //Never gets here
  graphic.scalePercent(72f / actualDpi * 100);

1voto

Gilbert Le Blanc Points 25590

D'après la JavaDoc com.lowagie.text.Image, la méthode getDpiX permet d'obtenir le nombre de points par pouce dans la direction des X. Elle renvoie zéro si elle n'est pas disponible.

Vous allez devoir assumer une valeur lorsque la méthode getDpiX renvoie zéro. 100 dpi est une hypothèse aussi bonne qu'une autre.

if (actualDpi <= 0) actualDpi = 100f;
graphic.scalePercent(72f / actualDpi * 100f);

0voto

Damien B Points 1608

Pour le GIF, il n'y a pas de place pour stocker une information "DPI" dans le fichier, donc "actualDpi" n'a aucune signification dans ce cas. Pour le JPEG, l'information "DPI" peut être stockée dans le fichier, mais n'est pas obligatoire, et si elle n'est pas définie : "actualDPI" n'a pas de sens non plus. La vraie réponse est : il n'existe pas de "DPI réel", soit l'information est fournie (par exemple, "dans cette image, je veux qu'un pixel soit rendu avec cette largeur (ou hauteur) physique spécifique"), soit elle ne l'est pas. Un autre élément se trouve dans votre phrase : "apparaissent toujours plus grands qu'ils ne sont censés l'être" ; le "censé être" est l'information DPI stockée dans l'image. Donc si cette information est absente, et que vous avez l'impression que lorsque vous ouvrez l'image, elle semble juste sur l'écran, alors vous devez calculer la densité de votre écran (largeur en nombre de pixels divisée par la largeur en pouces de votre écran), et utiliser cela comme votre variable "actualDPI".

0voto

steffen Points 616

La résolution de l'écran, récupérée par

java.awt.Toolkit.getDefaultToolkit().getScreenResolution()

n'a pas aidé, l'image était toujours trop grande. Cependant, on peut adapter l'image à la largeur de la page de la manière suivante :

BufferedImage bufferedImage = null; // your image
Image image = Image.getInstance(bufferedImage,null);
image.scalePercent((document.right()-document.left())/((float)image.getWidth())*100);

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X