Visualizzazione dei risultati da 1 a 6 su 6

Discussione: [Java] Picturebox

  1. #1
    Utente di HTML.it L'avatar di elilo
    Registrato dal
    Aug 2007
    Messaggi
    149

    [Java] Picturebox

    ciao,
    sto sviluppando una picturebox, simile a quella di visual basic per intenderci...
    sto cercando di modificare quella fatta da Mehmet Hakan Satman (qui il link)
    ma ho qualche problema:
    • Come ridimensiono l'immagine?
    • Come posiziono l'immagine?
    • Quando viene chiamato il paint (chiama lo stesso metodo anche il repaint?)


    questo è il mio codice:
    Codice PHP:
    /**
     * JPictureBox
     * 
     * @author Ilo
     * @version 1.0
     * @info Inspired on Java PictureBox Control 1.0 by Mehmet Hakan Satman
     */

    import java.awt.Canvas;
    import java.awt.Color;
    import java.awt.Graphics;
    import java.awt.Graphics2D;
    import java.awt.Image;
    import java.awt.MediaTracker;
    import java.awt.Point;
    import java.awt.RenderingHints;
    import java.awt.Toolkit;
    import java.awt.geom.AffineTransform;
    import java.awt.image.BufferedImage;
    import java.net.URL;

    import com.msmfc.exceptions.MSMFCImageException;

    public class 
    JPictureBox2 extends Canvas {

        private static final 
    long serialVersionUID 1L;
        
        
    // constants
        
    public final int REDIM_CENTER 1;
        public final 
    int REDIM_FILL 2;
        public final 
    int REDIM_FIX 3;
        public final 
    int REDIM_EXTEND 4;
        
        private 
    BufferedImage bImg;
        private 
    Graphics gImg;
        private 
    int width;
        private 
    int height;
        private 
    boolean doRepaint true;
        private 
    Color bgColor;
        private 
    Point imgPos;
        private 
    int redimType;
        
        public 
    JPictureBox2(int widthint height) {
            
    this.width width;
            
    this.height height;
            
            
    bImg = new BufferedImage(widthheightBufferedImage.TYPE_INT_RGB);
            
    gImg bImg.getGraphics();
            
            
    bgColor Color.WHITE;
            
    imgPos = new Point(00);
            
    redimType REDIM_CENTER;
        }
        
        public 
    void clear() {
            
    gImg.setColor(bgColor);
            
    gImg.clearRect(00widthheight);
            if(
    doRepaint)
                
    this.repaint();
        }
        
        public 
    boolean loadImage(String filename) {
            
    boolean result true;
            
    URL url null;
            
            try {
                
    url = new URL("file:" filename);
            } catch (
    Exception e) {
                
    result false;
            }
            
            
    MediaTracker med = new MediaTracker(this);
            
    Image gec Toolkit.getDefaultToolkit().getImage(url);
            
    med.addImage(gec0);
            
            try {
                
    med.waitForAll();
            } catch (
    Exception e) {
                
    result false;
            }
            
    gImg.drawImage(gec00this);
            
            if(
    doRepaint)
                
    this.repaint();
            
            return 
    result;
        }
        
        private 
    BufferedImage redimImage(BufferedImage imgint redimType) {
            
    double imgWidth img.getWidth();
            
    double imgHeight img.getHeight();
            
            switch(
    redimType) {
                case 
    REDIM_CENTER:
                    if((
    img.getHeight() < this.getHeight()) && (img.getWidth() < this.getWidth())) {
                        
    // center the image
                        
    int newX = (this.getWidth() - img.getWidth()) / 2;
                        
    int newY = (this.getHeight() - img.getHeight()) / 2;
                        
                        
    redimPos = new Point(newXnewY);
                    }
                    else {
                        
    // redim with FIX
                        // H : W = nH : nW
                        
    if(img.getHeight() >= img.getWidth()) {
                            
    // W = (H * nW) / nH
                            
    imgHeight this.getHeight();
                            
    imgWidth = (imgHeight this.getWidth()) / this.getHeight();
                        }
                        else {
                            
    // H = (W * nH) / nW
                            
    imgWidth this.getWidth();
                            
    imgHeight = (imgWidth this.getHeight()) / this.getWidth();
                        }
                    }
                    
                    break;
                case 
    REDIM_FILL:
                    
    // H : W = nH : nW
                    
    if(img.getHeight() < img.getWidth()) {
                        
    // W = (H * nW) / nH
                        
    imgHeight this.getHeight();
                        
    imgWidth = (imgHeight this.getWidth()) / this.getHeight();
                        
                        
    int newX = (-1) * ((img.getWidth() - this.getWidth()) /2);
                        
                        
    redimPos = new Point(newX0);
                    }
                    else {
                        
    // H = (W * nH) / nW
                        
    imgWidth this.getWidth();
                        
    imgHeight = (imgWidth this.getHeight()) / this.getWidth();

                        
    int newY = (-1) * ((img.getHeight() - this.getHeight()) /2);
                        
                        
    redimPos = new Point(0newY);
                    }
                    
                    break;
                case 
    REDIM_FIX:
                    
    // H : W = nH : nW
                    
    if(img.getHeight() >= img.getWidth()) {
                        
    // W = (H * nW) / nH
                        
    imgHeight this.getHeight();
                        
    imgWidth = (imgHeight this.getWidth()) / this.getHeight();
                    }
                    else {
                        
    // H = (W * nH) / nW
                        
    imgWidth this.getWidth();
                        
    imgHeight = (imgWidth this.getHeight()) / this.getWidth();
                    }
                    
                    break;
                case 
    REDIM_EXTEND:
                    
    imgHeight this.getHeight();
                    
    imgWidth this.getWidth();
                    
                    break;
            }    
            
            
    BufferedImage ret = new BufferedImage((int)imgWidth, (int)imgHeightimg.getType());

            
    Graphics2D g ret.createGraphics();
            
    AffineTransform at AffineTransform.getScaleInstance(imgWidthimgHeight);
            
    g.setRenderingHint(RenderingHints.KEY_INTERPOLATIONRenderingHints.VALUE_INTERPOLATION_BICUBIC);
            
    g.drawImage(imgatnull);
            
    g.dispose();
            
            return 
    ret;
        }

        @
    Override
        
    public void paint(Graphics g) {
            
    g.drawImage(bImgimgPos.ximgPos.ythis);
        }


    e la uso così

    Codice PHP:
    JPictureBox2 pic = new JPictureBox2(300200);
    this.getContentPane().add(pic);

    pic.clear();
    pic.loadImage("D:\\asso_picche.jpg"); 
    grazie in anticipo
    ciao
    "Se in un primo momento
    l'idea non è assurda,
    allora non c'è nessuna speranza
    che si realizzi."
    - Albert Einstein -

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284

    Re: [Java] Picturebox

    Originariamente inviato da elilo
    sto cercando di modificare quella fatta da Mehmet Hakan Satman (qui il link)
    ma ho qualche problema:
    • Come ridimensiono l'immagine?
    • Come posiziono l'immagine?
    • Quando viene chiamato il paint (chiama lo stesso metodo anche il repaint?)
    Canvas innanzitutto è roba "vecchia" di AWT. Io personalmente lo farei estendendo JPanel o JComponent.
    Inoltre vedo che c'è un metodo redimImage che è "privato" ma non è usato da alcuna parte (io dedurrei che chi ha scritto questa cosa non abbia saputo/voluto/potuto far "quadrare" bene le cose).
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Utente di HTML.it L'avatar di elilo
    Registrato dal
    Aug 2007
    Messaggi
    149
    ciao, grazie della risposta.
    avevo iniziato estendendo JPanel ma poi non funzionava e quindi ho cercato in internet e ho trovato quell'esempio che estendeva canvas (ho cercato cos'è canvas e diceva che era specifico per "disegnarci" sopra) quindi ho pensato che andasse bene.

    se dici che estendendo JPanel l'effetto è uguale e "disegnarci" sopra è comunque possibile (non solo caricare un'immagine...ma anche disegnare una stringa di testo o delle forme)

    ho notato anche che sbagliavo approccio con i metodi paint e repaint. infatti pensavo che il metodo paint venisse chiamato per disegnare qualcosa NEL canvas. invece è il metodo che disegna IL canvas nella JFrame. ho sistemato un pò le cose e ho una bozza iniziale...non sfrutta a pieno redimImage ma è un primo passo avanti.

    domani posto il codice anche perchè ho altre domande sulle immagini.

    grazie ancora...a domani
    "Se in un primo momento
    l'idea non è assurda,
    allora non c'è nessuna speranza
    che si realizzi."
    - Albert Einstein -

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da elilo
    se dici che estendendo JPanel l'effetto è uguale e "disegnarci" sopra è comunque possibile (non solo caricare un'immagine...ma anche disegnare una stringa di testo o delle forme)
    Certo che è possibile .... basta che apprendi come si effettua il painting nei componenti AWT/Swing.

    Originariamente inviato da elilo
    pensavo che il metodo paint venisse chiamato per disegnare qualcosa NEL canvas. invece è il metodo che disegna IL canvas nella JFrame.
    paint serve per dire al componente: "ehi componente, disegnati completamente!". Poi è ovvio che se si disegna .... lo vedi anche nel contenitore!

    Nei componenti AWT il metodo principale di painting è il public void paint(Graphics). Nei componenti Swing c'è ancora ovviamente il paint(Graphics) (che è il metodo "pubblico" e noto al framework) ma in Swing il disegno del componente viene "fattorizzato" internamente in 3 fasi, di cui una è protected void paintComponent(Graphics) ed è questo il contesto di disegno appropriato.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  5. #5
    Utente di HTML.it L'avatar di elilo
    Registrato dal
    Aug 2007
    Messaggi
    149
    allora,
    ho modificato la classe.
    - estende JPanel
    - ho fatto l'override del metodo paintCompnent
    Codice PHP:
        public void paintComponent(Graphics g) {
                
    super.paintComponent(g);
            
    g.drawImage(bImg00null);
        } 
    - ho modificato il metodo loadImage (adesso setImage)
    Codice PHP:
        public boolean setImage(String filename) {
            
    boolean result true;
            
    URL url null;
            
            try {
                
    url = new URL("file:" filename);
                
                
    System.out.println("Trying to load " url);
                
                
    MediaTracker med = new MediaTracker(this);

                
    BufferedImage image ImageIO.read(url);
                
    image redimImage(imageredimType);
                
    Image gec Toolkit.getDefaultToolkit().createImage(image.getSource());
                
                
    med.addImage(gec0);
                
    med.waitForAll();
                
                
    gImg.drawImage(gecimgPos.ximgPos.ythis);
                
            } catch (
    MalformedURLException e2) {
                
    result false;
            } catch (
    IOException e) {
                
    result false;
            } catch (
    InterruptedException e) {
                
    result false;
            }
            
            
    repaint();
            
            return 
    result;
        } 
    ora così funziona
    Codice PHP:
        private BufferedImage redimImage(BufferedImage imgint redimType) {
            
    int imgWidth img.getWidth();
            
    int imgHeight img.getHeight();

                      .......................................

                case 
    REDIM_EXTEND:
                    
    imgHeight this.height;
                    
    imgWidth this.width;
                    
                    break;
            }
            

            return 
    resizeImg(imgimgWidthimgHeight);
        }
        
        private 
    BufferedImage resizeImg(BufferedImage imgint newWint newH) {
            
    int w img.getWidth();
            
    int h img.getHeight();
            
    BufferedImage dimg = new BufferedImage(newWnewHimg.getType());
            
    Graphics2D g dimg.createGraphics();
            
    g.setRenderingHint(RenderingHints.KEY_INTERPOLATIONRenderingHints.VALUE_INTERPOLATION_BILINEAR);
            
    g.drawImage(img00newWnewH00whnull);
            
    g.dispose();
            return 
    dimg;
        } 
    devo fare ancora tutti i test però ci siamo quasi..
    ora visto che l'immagine prende una posizione diversa rispetto alla dimensione del componente, devo fare l'override dei metodi di ridimensionamento del componente (setSize, setPreferredSize,...) per ricalcolare la posizione dell'immagine o c'è un modo più semplice??

    grazie ancora andbin per le dritte
    "Se in un primo momento
    l'idea non è assurda,
    allora non c'è nessuna speranza
    che si realizzi."
    - Albert Einstein -

  6. #6
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da elilo
    codice:
    	public boolean setImage(String filename) {
    		
    			url = new URL("file:" + filename);
    			
    			BufferedImage image = ImageIO.read(url);
    Piccola cosa che ho notato immediatamente. Se parti con l'avere un normale path sul file-system, allora non serve usare URL. ImageIO ha un read che riceve un java.io.File.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.