usar toda tamaño setsize resolucion que para pantalla ocupe obtener hacer dinamica cualquier como codigo cambiar adaptar abarque java javax.imageio

toda - obtener la resolucion de pantalla en java



¿Cómo obtener la altura y el ancho de la imagen usando java? (12)

¿Hay alguna otra manera además de usar ImageIO.read para obtener la altura y el ancho de la imagen?

Porque encuentro un problema que bloquea el hilo.

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)

Este error solo ocurre en un servidor de aplicaciones de Sun y, por lo tanto, sospecho que es un error de Sun.


Aquí hay algo muy simple y práctico.

BufferedImage bimg = ImageIO.read(new File(filename)); int width = bimg.getWidth(); int height = bimg.getHeight();



Esta es una reescritura de la gran publicación de @Kay, que arroja IOException y proporciona una salida anticipada:

/** * Gets image dimensions for given file * @param imgFile image file * @return dimensions of image * @throws IOException if the file is not a known image */ public static Dimension getImageDimension(File imgFile) throws IOException { int pos = imgFile.getName().lastIndexOf("."); if (pos == -1) throw new IOException("No extension for file: " + imgFile.getAbsolutePath()); String suffix = imgFile.getName().substring(pos + 1); Iterator<ImageReader> iter = ImageIO.getImageReadersBySuffix(suffix); while(iter.hasNext()) { ImageReader reader = iter.next(); try { ImageInputStream stream = new FileImageInputStream(imgFile); reader.setInput(stream); int width = reader.getWidth(reader.getMinIndex()); int height = reader.getHeight(reader.getMinIndex()); return new Dimension(width, height); } catch (IOException e) { log.warn("Error reading: " + imgFile.getAbsolutePath(), e); } finally { reader.dispose(); } } throw new IOException("Not a known image file: " + imgFile.getAbsolutePath()); }

Supongo que mi representante no es lo suficientemente alto como para que mi opinión sea considerada digna como respuesta.


He encontrado otra manera de leer un tamaño de imagen (más genérico). Puede usar la clase ImageIO en cooperación con ImageReaders. Aquí está el código de ejemplo:

private Dimension getImageDim(final String path) { Dimension result = null; String suffix = this.getFileSuffix(path); Iterator<ImageReader> iter = ImageIO.getImageReadersBySuffix(suffix); if (iter.hasNext()) { ImageReader reader = iter.next(); try { ImageInputStream stream = new FileImageInputStream(new File(path)); reader.setInput(stream); int width = reader.getWidth(reader.getMinIndex()); int height = reader.getHeight(reader.getMinIndex()); result = new Dimension(width, height); } catch (IOException e) { log(e.getMessage()); } finally { reader.dispose(); } } else { log("No reader found for given format: " + suffix)); } return result; }

Tenga en cuenta que getFileSuffix es un método que devuelve la extensión de ruta sin "." por ejemplo, png, jpg, etc. La implementación de ejemplo es:

private String getFileSuffix(final String path) { String result = null; if (path != null) { result = ""; if (path.lastIndexOf(''.'') != -1) { result = path.substring(path.lastIndexOf(''.'')); if (result.startsWith(".")) { result = result.substring(1); } } } return result; }

Esta solución es muy rápida ya que solo se lee el tamaño de la imagen del archivo y no la imagen completa. Lo probé y no hay comparación con el rendimiento de ImageIO.read. Espero que alguien encuentre esto útil.



Manera simple:

BufferedImage readImage = null; try { readImage = ImageIO.read(new File(your path); int h = readImage.getHeight(); int w = readImage.getWidth(); } catch (Exception e) { readImage = null; }


Obtener una Imagen Bufferizada con ImageIO.read es un método muy pesado, ya que está creando una copia completa sin comprimir de la imagen en la memoria. Para PNG también puede usar pngj y el código:

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


Para obtener el tamaño del archivo emf sin EMF Image Reader puedes usar el código:

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); }


Puede cargar datos binarios jpeg como un archivo y analizar los encabezados jpeg usted mismo. El que está buscando es el encabezado 0xFFC0 o Start of Frame:

Start of frame marker (FFC0) * the first two bytes, the length, after the marker indicate the number of bytes, including the two length bytes, that this header contains * P -- one byte: sample precision in bits (usually 8, for baseline JPEG) * Y -- two bytes * X -- two bytes * Nf -- one byte: the number of components in the image o 3 for color baseline JPEG images o 1 for grayscale baseline JPEG images * Nf times: o Component ID -- one byte o H and V sampling factors -- one byte: H is first four bits and V is second four bits o Quantization table number-- one byte The H and V sampling factors dictate the final size of the component they are associated with. For instance, the color space defaults to YCbCr and the H and V sampling factors for each component, Y, Cb, and Cr, default to 2, 1, and 1, respectively (2 for both H and V of the Y component, etc.) in the Jpeg-6a library by the Independent Jpeg Group. While this does mean that the Y component will be twice the size of the other two components--giving it a higher resolution, the lower resolution components are quartered in size during compression in order to achieve this difference. Thus, the Cb and Cr components must be quadrupled in size during decompression.

Para obtener más información acerca de los encabezados, consulte la entrada de jpeg de wikipedia o aquí obtengo la información anterior.

Utilicé un método similar al siguiente código que obtuve de esta publicación en los foros de sol:

import java.awt.Dimension; import java.io.*; public class JPEGDim { public static Dimension getJPEGDimension(File f) throws IOException { FileInputStream fis = new FileInputStream(f); // check for SOI marker if (fis.read() != 255 || fis.read() != 216) throw new RuntimeException("SOI (Start Of Image) marker 0xff 0xd8 missing"); Dimension d = null; while (fis.read() == 255) { int marker = fis.read(); int len = fis.read() << 8 | fis.read(); if (marker == 192) { fis.skip(1); int height = fis.read() << 8 | fis.read(); int width = fis.read() << 8 | fis.read(); d = new Dimension(width, height); break; } fis.skip(len - 2); } fis.close(); return d; } public static void main(String[] args) throws IOException { System.out.println(getJPEGDimension(new File(args[0]))); }

}


Puede obtener el ancho y alto de la imagen con el objeto BufferedImage usando 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(); }


Puede usar el Toolkit, sin necesidad de ImageIO

Image image = Toolkit.getDefaultToolkit().getImage(file.getAbsolutePath()); int width = image.getWidth(null); int height = image.getHeight(null);

Si no quiere manejar la carga de la imagen, haga

ImageIcon imageIcon = new ImageIcon(file.getAbsolutePath()); int height = imageIcon.getIconHeight(); int width = imageIcon.getIconWidth();


Traté de probar el rendimiento usando algunos de los diferentes enfoques enumerados. Es difícil hacer una prueba rigurosa ya que muchos factores afectan el resultado. Preparé dos carpetas, una con 330 archivos jpg y otra con 330 archivos png. El tamaño promedio del archivo fue de 4Mb en ambos casos. Luego llamé a getDimension para cada archivo. Cada implementación del método getDimension y cada tipo de imagen se probó por separado (ejecución separada). Aquí están los tiempos de ejecución que obtuve (primer número para jpg, segundo número para png):

1(Apurv) - 101454ms, 84611ms 2(joinJpegs) - 471ms, N/A 3(Andrew Taylor) - 707ms, 68ms 4(Karussell, ImageIcon) - 106655ms, 100898ms 5(user350756) - 2649ms, 68ms

Es obvio que algunos métodos cargan todo el archivo para obtener dimensiones, mientras que otros solo leen la información del encabezado de la imagen. Creo que estos números pueden ser útiles cuando el rendimiento de la aplicación es crítico.

Gracias a todos por la contribución a este hilo, muy útil.