read images example java image bufferedimage

java - images - ¿Cómo convertir imagen de búfer a imagen y viceversa?



java awt image (6)

En realidad estoy trabajando en un software de edición de imágenes y ahora quiero convertir la imagen almacenada en búfer, es decir:

BufferedImage buffer = ImageIO.read(new File(file));

a Imagen es decir en el formato algo como:

Image image = ImageIO.read(new File(file));

¿Es posible así? ¿¿Si es así, entonces cómo??


BufferedImage es una (n) imagen, por lo que la conversión implícita que estás haciendo en la segunda línea se puede compilar directamente. Si supieras que una Imagen era realmente una Imagen de Buffer, tendrías que lanzarla explícitamente así:

Image image = ImageIO.read(new File(file)); BufferedImage buffered = (BufferedImage) image;

Debido a que BufferedImage amplía la imagen, puede caber en un contenedor de imágenes. Sin embargo, cualquier imagen puede caber allí, incluidas las que no son BufferedImage, y como tal, puede obtener una ClassCastException en el tiempo de ejecución si el tipo no coincide, porque una BufferedImage no puede contener ningún otro tipo a menos que extienda BufferedImage.


Ejemplo: digamos que tiene una ''imagen'' que desea escalar, probablemente necesitará una imagen almacenada y probablemente comience con solo el objeto ''Imagen''. Así que esto funciona, creo ... El AVATAR_SIZE es el ancho objetivo que queremos que nuestra imagen sea:

Image imgData = image.getScaledInstance(Constants.AVATAR_SIZE, -1, Image.SCALE_SMOOTH); BufferedImage bufferedImage = new BufferedImage(imgData.getWidth(null), imgData.getHeight(null), BufferedImage.TYPE_INT_RGB); bufferedImage.getGraphics().drawImage(imgData, 0, 0, null);


La forma correcta es utilizar SwingFXUtils.toFXImage(bufferedImage,null) para convertir una BufferedImage en una instancia de JavaFX Image y SwingFXUtils.fromFXImage(image,null) para la operación inversa.

Opcionalmente, el segundo parámetro puede ser WritableImage para evitar una mayor asignación de objetos.


Puede intentar guardar (o escribir) la imagen almacenada con los cambios realizados y luego abrirla como una imagen.

EDITAR:

try { // Retrieve Image BufferedImage buffer = ImageIO.read(new File("old.png"));; // Here you can rotate your image as you want (making your magic) File outputfile = new File("saved.png"); ImageIO.write(buffer, "png", outputfile); // Write the Buffered Image into an output file Image image = ImageIO.read(new File("saved.png")); // Opening again as an Image } catch (IOException e) { ... }


Solo una información: recordemos que la clase Image es en realidad una clase abstracta y al hacer referencia a una variable de esta con BufferedImage solo almacena o devuelve la dirección de memoria de cualquier Objeto.

Además, por lo tanto, el método read() estático de java.awt.image.imageIO devuelve un objeto BufferedImage , por lo tanto, no hay duda de que el uso de operator / expresión instanceof BufferedImage en ese objeto devolverá true .

De hecho, al ser abstracto, la clase de Image tiene firmas de métodos tales como:

  1. public abstract Graphics getGraphics()
  2. public abstract ImageProducer getSource()

entre otros.

Insisto, una variable de Image real solo contiene direcciones de memoria de un objeto concreto de subclase de imagen, casi como punteros en C, C ++, Ada, etc.

Si ha sido introducido o avanzado en esos idiomas, y también en instancias de interfaz de Java como Runnable , javax.sound.Clip , AWT''s Shape , etc. Tenga en cuenta que la Image tiene: imagen public abstract Image getScaledInstance(...) : usted obtiene el punto. (Por supuesto, la escala en la programación de gráficos 2D es intercambiable para cambiar el tamaño, por lo que la precisión es deseable).

Pero en un caso imposible cuando aquí el método de ImageIO regresa ! (instanceof BufferedImage) ! (instanceof BufferedImage) simplemente crea un nuevo objeto BufferedImage con este ImgObjNotInstncfBufImg asignado a uno de sus argumentos de constructor. Luego, at (racional) manipulará esto en la lógica de su código.

De todos modos, la clase Transformación afín es adecuada para transformar Formas e Imágenes a sus formas escaladas, rotadas, reubicadas, etc., por lo que le recomiendo que estudie cómo usar una "transformada afín".

Tenga en cuenta que puede manipular los píxeles reales en dicho Raster de imagen (bueno, otra jerga gráfica 2D gráfica a la que se debe hacer referencia en un glosario técnico) que tal vez sea una habilidad ejercida en Java en las operaciones binarias de blitwise, en tipos de búfer de imagen que almacenan atributos de color individuales en una compacta de 32 bytes - 7 bits cada uno para los valores alfa y RGB.

Sospecho que lo vas a usar en imágenes de capas. Entonces, FINALMENTE, lo racional es que solo hace referencia a BufferedImage con la Imagen abstracta, y si alguna vez su objeto Image no es una imagen BufferedImage , puede crear una imagen de esta instancia de imagen relacionada pero no de Buffer. sin tener que preocuparse por ninguna conversión, casting, autoboxing o lo que sea; manipular un BufferedImage realmente significa manipular también el objeto subyacente que contiene datos de la imagen raíz al que apunta.

Está bien, terminado; Creo que ciertamente extraje y dividí el punto muerto al que puedes haber pensado que te enfrentas. Como he dicho, las clases abstractas en java, y también las interfaces, son en gran medida equivalentes de los operadores de bajo nivel, más cercanos al hardware, llamados punteros en otros idiomas.