Foros aprenderaprogramar.com
Aprender a programar => Aprender a programar desde cero => Mensaje iniciado por: mzamora60 en 04 de Noviembre 2015, 15:52
-
Buen dia. Tengo una consulta con respecto a como introducir una imagen como parametro en una clase BufferedImage. Este es un extracto de mi código.
package test3;
import javax.swing.JPanel;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.RenderingHints;
import java.awt.image.BufferedImage;
import javax.swing.JPanel;
public class zoom extends JPanel{
private Image FOTO_ORIGINAL;
private Image FOTO_tmp;
private BufferedImage Imagen_en_memoria;
private Graphics2D g2D;
private boolean con_foto = false;
private int valEscalaX=0;
private int valEscalaY=0;
/* al crear el objeto se crea con una imagen pasada como parametro*/
public zoom(BufferedImage f){ /*[u][b]esta es la duda de como se mete aqui la foto como parametro[/b][/u]?*/
this.FOTO_ORIGINAL = f;
this.FOTO_tmp = f;
this.setSize(f.getWidth(),f.getHeight());
this.setVisible(true);
this.con_foto=true;
}
Por cuanto se pueda hacer muchas gracias de antemano. Saludos cordiales,
-
Hola la clase BufferedImage se usa para mantener una representación de una imagen en memoria dentro de una aplicación Java, de modo que la puedes modificar o guardar en cualquiera de los formatos estándar propios de imágenes.
Para pasar como parámetro una BufferedImage antes habrás tenido que crearla con un constructor (igual que haces con cualquier otra clase, por ejemplo un ArrayList antes de pasarlo como parámetro tienes que haberlo creado), por ejemplo
import java.awt.image.BufferedImage;
...
BufferedImage img = new BufferedImage(256, 256, BufferedImage.TYPE_INT_RGB);
Esto crea una imagen de 256x256 píxeles sin transparencia. Todavía faltaría "dibujar la imagen", es decir, asignarle valores a sus píxeles, de modo que después puede ser guardada. Para asignar valores a los píxeles se puede hacer a bajo nivel, que sería establecer valores directamente con los métodos setRGB() ó a alto nivel basándonos en definir formas geométricas, una imagen de partida, etc.
Ejemplo de uso:
private void loadData(){
if (!this.file.exists()) {
throw new RuntimeException("Skinfile '" + this.file.getName() + "' does not exist!");
}
try {
BufferedImage img=ImageIO.read(this.file);
this.width=img.getWidth();
this.height=img.getHeight();
this.pixelData=new Color[this.width][this.height];
this.blockTypes=new ColorBlock[this.width][this.height];
for (int x=0; x < this.width; x++) {
for (int y=0; y < this.height; y++) {
this.pixelData[x][this.height - y - 1]=new Color(img.getRGB(x,y));
}
}
this.loaded=true;
}
catch ( Exception e) {
e.printStackTrace();
}
}
Un ejemplo más completo donde se crea un BufferedImage a partir de una imagen en formato png. En este código tienes que cambiar la línea String imageURL = "image.png"; para poner la ruta de la imagen que quieras utilizar
import java.awt.Component;
import java.awt.Frame;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.GraphicsConfiguration;
import java.awt.GraphicsDevice;
import java.awt.GraphicsEnvironment;
import java.awt.Image;
import java.awt.Toolkit;
import java.awt.Transparency;
import java.awt.image.BufferedImage;
import java.awt.image.ImageObserver;
public class ImageToBufferedImage {
static BufferedImage image;
static boolean imageLoaded = false;
public static void main(String[] args) {
// The ImageObserver implementation to observe loading of the image
ImageObserver myImageObserver = new ImageObserver() {
public boolean imageUpdate(Image image, int flags, int x, int y, int width, int height) {
if ((flags & ALLBITS) != 0) {
imageLoaded = true;
System.out.println("Image loading finished!");
return false;
}
return true;
}
};
// The image URL - change to where your image file is located!
String imageURL = "image.png";
/**
* This call returns immediately and pixels are loaded in the background
* We use an ImageObserver to be notified when the loading of the image
* is complete
*/
Image sourceImage = Toolkit.getDefaultToolkit().getImage(imageURL);
sourceImage.getWidth(myImageObserver);
// We wait until the image is fully loaded
while (!imageLoaded) {
try {
Thread.sleep(100);
} catch (InterruptedException e) {
}
}
// Create a buffered image from the source image with a format that's compatible with the screen
GraphicsEnvironment graphicsEnvironment = GraphicsEnvironment.getLocalGraphicsEnvironment();
GraphicsDevice graphicsDevice = graphicsEnvironment.getDefaultScreenDevice();
GraphicsConfiguration graphicsConfiguration = graphicsDevice.getDefaultConfiguration();
// If the source image has no alpha info use Transparency.OPAQUE instead
image = graphicsConfiguration.createCompatibleImage(sourceImage.getWidth(null), sourceImage.getHeight(null), Transparency.BITMASK);
// Copy image to buffered image
Graphics graphics = image.createGraphics();
// Paint the image onto the buffered image
graphics.drawImage(sourceImage, 0, 0, null);
graphics.dispose();
// Create frame with specific title
Frame frame = new Frame("Example Frame");
// Add a component with a custom paint method
frame.add(new CustomPaintComponent());
// Display the frame
int frameWidth = 300;
int frameHeight = 300;
frame.setSize(frameWidth, frameHeight);
frame.setVisible(true);
}
/**
* To draw on the screen, it is first necessary to subclass a Component and
* override its paint() method. The paint() method is automatically called
* by the windowing system whenever component's area needs to be repainted.
*/
static class CustomPaintComponent extends Component {
public void paint(Graphics g) {
// Retrieve the graphics context; this object is used to paint shapes
Graphics2D g2d = (Graphics2D) g;
/**
* Draw an Image object The coordinate system of a graphics context
* is such that the origin is at the northwest corner and x-axis
* increases toward the right while the y-axis increases toward the
* bottom.
*/
int x = 0;
int y = 0;
g2d.drawImage(image, x, y, this);
}
}
}
Saludos
-
Muchas gracias por la respuesta ya he podido cargar las imágenes, sin embargo requiero cargar la ruta absoluta de las imagenes que se encuentran en un objeto JTexField dentro de una variable BufferedImage img, pero consigo el siguiente error :
javax.imageio.IIOException: Can't read input file!
Ejemplo:
El JTextField tiene la cadena C:\\User\\Desktop\\imagenes\\foto.jpg lo que requiero es que esta ruta se inserte dentro de la variable de tipo BufferedImage img para que pueda manipular la imagen con los metodos de redimensionamiento que ya programe y probe que trabajan correctamente. Aquí mi código y gracias de antemano por lo que se pueda hacer:
String fichero = txtimagen.getText(); //Se pretende que la variable fichero almacene la cadena que contendra la ruta absoluta //
String cod = txtfolio.getText();
ImageIcon dtCat = new ImageIcon(imagen.getfoto(cod));
Icon icono = new ImageIcon(dtCat.getImage().getScaledInstance(800, 1050, Image.SCALE_DEFAULT));
lblimage.setIcon(icono);
sw = true;
try {
img = ImageIO.read(new File("")); //aqui es donde se requiere la cadena con la ruta absoluta para traer la imagen con la variable de tipo BufferedImage en este caso img.
} catch (IOException ex) {
java.util.logging.Logger.getLogger(pagosinfonavit.class.getName()).log(Level.SEVERE, null, ex);
}
pd = new zoom(img);
pd.repaint();
lblimage.add(pd);
JToolBar barra = new JToolBar();
JMenuItem aumentar = new JMenuItem("Zoom (+)");
aumentar.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
if(sw){
pd.Aumentar(120);
...
En espera de sus valiosos comentarios. :)
-
Buenas tardes , primero comentar que impresionante el aporte de Alex, no hay icono de aplausos aqui jejeje.
Segundo sobre lo que comentas de que requieres la dirección absoluta, echale un vistazo a la clase Path y en concreto a su metodo toAbsolutePath().
Espero te sirva, un saludo.
-
Gracias Lorenzo y en efecto tambien reconozco el perfecto dominio de alex sobre manipulación de imagenes con la clase Image y/o BufferedImage. Ahora dejame explicarte un poco con respecto a lo que requiero el metodo getAbsolutePath() en efecto te devuelve la ruta absoluta y para ello lo que he hecho es crear un objeto de tipo File. Ejemplo:
.
.
.
public static void main (String[] args) {
File ficheroImagen = new File("imagen.jpg");
System.out.println("la ruta absoluta es" + fichero.getAbsolutePath());
}
si corremos este muy sencillo programita en efecto y como tu bien lo comentas arrojara la ruta absoluta por ejemplo:
C:\User\Desktop\imagenes\imagen.jpg
Mi Dilema Lorenzo radica en que ya no necesito obtener la ruta absoluta porque ya la tengo dentro de un objeto JTextField que en este caso tiene el nombre de txtImagen.getText() y cuya etiqueta es un JLabel denominada Ruta Imagen, ahora bien este contenido de texto (ruta absoluta ), del ya mencionado JTextField necesito que se inserte dentro de mi variable de tipo BufferedImage que se llama img. Anexo código de la variable:
BufferedImage img = null;
img = ImageIO.read(new File("Aqui Lorenzo es donde necesito que se inserte el contenido de texto del JTextField amigo"));
Si lo puedo lograr entonces puedo cantar victoria, jejeje.
:)
-
Buenas noches, entonces lo que necesitas es simple.
Crea un nuevo objeto:
import java.nio.file.Paths;
Path direccion = Paths.get(txtImagen.getText());
direccion = direccion.toAbsolutePath();
Y luego haz lo siguiente:
BufferedImage img = null;
img = ImageIO.read(new File(direccion.toString()));
Un saludo.
-
Gracias Lorenzo. Pues lo hice tal cual me indicaste y ahora me arroja el siguiente error:
javax.imageio.IIOException: Can't create an ImageInputStream!
:(
-
Buenas mzamora60,
Bueno, realmente lo que yo te resolví, o intenté es lo de pasar un JTextField a Path.
De la instrucción siguiente, con el Path lo que si crea seguro es el new File(direccion.toString() );
si yo fuera tu, guardaria ese File en una variable, porque ahora mismo es anónimo.
File archivoImagen = new File (direccion.toString() );
Con eso consigues tenerlo guardado para otras acciones y lo más importante puedes comprobar que se crea correctamente.
Luego ya;
BufferedImage img = ImageIO.read(archivoImagen);
Cuando compruebes que el File se crea correctamente y la imagen, si quieres ya lo volverás a pasar a anonimo con en new File dentro del ImageIO.read.
Yo empezaría por ahí a ver donde da el error. Linea y razon etc.
Un saludo.