119 votes

Comment obtenir la hauteur et la largeur d'une image en utilisant java ?

Y a-t-il un autre moyen que d'utiliser ImageIO.read pour obtenir la hauteur et la largeur de l'image ?

Parce que je rencontre un problème qui bloque le fil de discussion.

at com.sun.medialib.codec.jpeg.Decoder.njpeg_decode(Native Method)      
at com.sun.medialib.codec.jpeg.Decoder.decode(Decoder.java:87)      
at com.sun.media.imageioimpl.plugins.jpeg.CLibJPEGImageReader.decode(CLibJPEGImageReader.java:73)     
 - locked <0xd96fb668> (a com.sun.media.imageioimpl.plugins.jpeg.CLibJPEGImageReader)      
at com.sun.media.imageioimpl.plugins.clib.CLibImageReader.getImage(CLibImageReader.java:320)    
 - locked <0xd96fb668> (a com.sun.media.imageioimpl.plugins.jpeg.CLibJPEGImageReader)     
 at com.sun.media.imageioimpl.plugins.clib.CLibImageReader.read(CLibImageReader.java:384)   
 - locked <0xd96fb668> (a com.sun.media.imageioimpl.plugins.jpeg.CLibJPEGImageReader)      
at javax.imageio.ImageIO.read(ImageIO.java:1400)      
at javax.imageio.ImageIO.read(ImageIO.java:1322)

Cette erreur ne se produit que sur un serveur d'applications Sun et je soupçonne donc qu'il s'agit d'un bogue Sun.

3voto

KIBOU Hassan Points 160

Vous pouvez obtenir la largeur et la hauteur de l'image avec l'objet BufferedImage en utilisant java.

public void setWidthAndHeightImage(FileUploadEvent event){
    byte[] imageTest = event.getFile().getContents();
                baiStream = new ByteArrayInputStream(imageTest );
                BufferedImage bi = ImageIO.read(baiStream);
                //get width and height of image
                int imageWidth = bi.getWidth();
                int imageHeight = bi.getHeight();
    }

3voto

Fabien Marsaud Points 41

Ayant lutté avec ImageIO beaucoup ces dernières années, je pense Andrew Taylor 's solution est de loin le meilleur compromis (rapide : pas d'utilisation de ImageIO#read et polyvalent). Merci monsieur !

Mais j'étais un peu frustré d'être obligé d'utiliser un fichier local (File/String), surtout dans les cas où vous voulez vérifier la taille des images provenant, par exemple, d'une requête multipart/form-data où vous récupérez habituellement InputPart / InputStream 's. J'ai donc rapidement créé une variante qui accepte File , InputStream y RandomAccessFile sur la base de la capacité de ImageIO#createImageInputStream pour le faire.

Bien sûr, une telle méthode avec Object input ne peut que rester privée et vous devez créer autant de méthodes polymorphes que nécessaire, en appelant celle-ci. Vous pouvez également accepter Path con Path#toFile() y URL con URL#openStream() avant de passer à cette méthode :

  private static Dimension getImageDimensions(Object input) throws IOException {

    try (ImageInputStream stream = ImageIO.createImageInputStream(input)) { // accepts File, InputStream, RandomAccessFile
      if(stream != null) {
        IIORegistry iioRegistry = IIORegistry.getDefaultInstance();
        Iterator<ImageReaderSpi> iter = iioRegistry.getServiceProviders(ImageReaderSpi.class, true);
        while (iter.hasNext()) {
          ImageReaderSpi readerSpi = iter.next();
          if (readerSpi.canDecodeInput(stream)) {
            ImageReader reader = readerSpi.createReaderInstance();
            try {
              reader.setInput(stream);
              int width = reader.getWidth(reader.getMinIndex());
              int height = reader.getHeight(reader.getMinIndex());
              return new Dimension(width, height);
            } finally {
              reader.dispose();
            }
          }
        }
        throw new IllegalArgumentException("Can't find decoder for this image");
      } else {
        throw new IllegalArgumentException("Can't open stream for this image");
      }
    }
  }

1voto

Jessi Points 91

Obtenir une image tamponnée avec ImageIO.read est une méthode très lourde, car elle crée une copie complète non compressée de l'image en mémoire. Pour les png's vous pouvez aussi utiliser pngj et le code :

if (png)
    PngReader pngr = new PngReader(file);
    width = pngr.imgInfo.cols;
    height = pngr.imgInfo.rows;
    pngr.close();
}

-1voto

AppEmmanuel Points 136

Malheureusement, après avoir essayé toutes les réponses ci-dessus, je n'ai pas réussi à les faire fonctionner après d'innombrables essais. J'ai donc décidé de faire le vrai hack moi-même et je vais ceci pour travailler pour moi. J'espère que cela fonctionnera parfaitement pour vous aussi.

J'utilise cette méthode simple pour obtenir la largeur d'une image générée par l'application et qui doit être téléchargée ultérieurement pour vérification :

Attention : vous devez activer les permissions dans le manifeste pour accéder au stockage.

/ Je l'ai rendu statique et je l'ai placé dans ma classe Global pour pouvoir y faire référence ou y accéder à partir d'une seule source et s'il y a une modification, elle devra être faite à un seul endroit. Il s'agit simplement de maintenir un concept DRY en java (de toute façon) :) /

public static int getImageWidthOrHeight(String imgFilePath) {

            Log.d("img path : "+imgFilePath);

            // Decode image size
            BitmapFactory.Options o = new BitmapFactory.Options();
            o.inJustDecodeBounds = true;
            BitmapFactory.decodeFile(imgFilePath, o);

            int width_tmp = o.outWidth, height_tmp = o.outHeight;

            Log.d("Image width : ", Integer.toString(width_tmp) );

            //you can decide to rather return height_tmp to get the height.

            return width_tmp;

}

-2voto

Viktor Sirotin Points 9

Pour obtenir la taille d'un fichier emf sans EMF Image Reader, vous pouvez utiliser le code :

Dimension getImageDimForEmf(final String path) throws IOException {

    ImageInputStream inputStream = new FileImageInputStream(new File(path));

    inputStream.setByteOrder(ByteOrder.LITTLE_ENDIAN);

    // Skip magic number and file size
    inputStream.skipBytes(6*4);

    int left   = inputStream.readInt();
    int top    = inputStream.readInt();
    int right  = inputStream.readInt();
    int bottom = inputStream.readInt();

    // Skip other headers
    inputStream.skipBytes(30);

    int deviceSizeInPixelX = inputStream.readInt();
    int deviceSizeInPixelY = inputStream.readInt();

    int deviceSizeInMlmX = inputStream.readInt();
    int deviceSizeInMlmY = inputStream.readInt();

    int widthInPixel = (int) Math.round(0.5 + ((right - left + 1.0) * deviceSizeInPixelX / deviceSizeInMlmX) / 100.0);
    int heightInPixel = (int) Math.round(0.5 + ((bottom-top + 1.0) * deviceSizeInPixelY / deviceSizeInMlmY) / 100.0);

    inputStream.close();

    return new Dimension(widthInPixel, heightInPixel);
}

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