Avatar billede codemon Nybegynder
03. marts 2003 - 13:28 Der er 10 kommentarer og
1 løsning

Sammenligne 2 image

Hvordan sammenligner jeg to image objekter for at se om de repræsenterer det samme billede.

De er forskellige instanser så == eller equals går ikke.

De bliver hentet fra system clipboardet, men jeg har brug for at kunne holde løbende øje med om der kommer et nyt billede ind i clipboard. Fordi det hele tiden er nye instanser der hentes med clipboard.getContents(null).getTransferData(DataFlavor.imageFlavor); tror jeg at det nemmeste er at sammeligne billederne for at se om der er kommet et nyt til clipboard.
Avatar billede arne_v Ekspert
03. marts 2003 - 13:45 #1
Hvis equals er implementeret bare nogenlunde fornuftigt for den
klasse, så bør euqlas kunne bruges !
Avatar billede arne_v Ekspert
03. marts 2003 - 13:45 #2
euqlas<DEL><DEL><DEL><DEL><DEL><DEL>equals

:-)
Avatar billede codemon Nybegynder
03. marts 2003 - 13:57 #3
equals er ikke implementeret. Arvet fra Object er det det samme som ==
Avatar billede arne_v Ekspert
03. marts 2003 - 14:14 #4
Hvilken klasse får du returneret ?

(DataFlavor har equals)
Avatar billede codemon Nybegynder
03. marts 2003 - 14:39 #5
et java.awt.datatransfer.Transferable object med clipboard.getContents(null) og et Image med (Image)getTransferData(DataFlavor.imageFlavor);

Det er samme clipboard objekt der hentes fra, men hver gang getContents kaldes returneres et nyt objekt selvom der ikke er kommet nyt til clipboardet.
Avatar billede =maddog= Nybegynder
03. marts 2003 - 16:57 #6
har dette en jordisk chance for at virke? ideen er jo god nok. find ud af om de har samme pixelmap.
    public boolean compareImage(Image source, Image org, ImageObserver io) {
        int width = source.getWidth(io);
        int height = source.getHeight(io);
        if (width!=org.getWidth(io)&&height!=org.getHeight(io)) {
            // Vi skal bestemme os for om vi vil scalere og sammenligne
            // eller slet og ret erklære dem for ulig når der ikke
            // er samme højde og bredde
            return false;
        } else {
            // Øv da. Masser af arbejde. Skriv Image's pixels
            // ind i et array og sammenlign
            int[] pixels = new int[width*height*2];
            PixelGrabber pg1 = new PixelGrabber( source,
            0,
            0,
            width,
            height,
            pixels,
            0,
            width
            );
            PixelGrabber pg2 = new PixelGrabber( org,
            0,
            0,
            width,
            height,
            pixels,
            width*height,
            width
            );
            pg1.startGrabbing();
            pg2.startGrabbing();
            boolean retVal = true; int i= 0;
            while (retVal) {
                // sammenlign.
                retVal = (pixels[i]==pixels[width*height+i]);
                i++;
            }
            return retVal;
        }
    }
Avatar billede =maddog= Nybegynder
03. marts 2003 - 16:59 #7
i++; if(i==width*height) break;
ellers kommer den til at kaste en ArrayIndexOutOfBoundsException lignende ting.
Avatar billede codemon Nybegynder
05. marts 2003 - 22:43 #8
Efter jeg fandt ud af at det egentlig er et BufferedImage der returneres fra clipboardet fik jeg det til at virke ved at:
hente billedets raster - BufferedImage.getData();
overfører til et array - Raster.getPixels(...);
sammenligne nyt og gammelt pixel array - Arrays.equals(...);

          do
          {
              bufI= (BufferedImage)getClipboard();
              try{ Thread.sleep(200); }
              catch (InterruptedException ire){ }
            }
      while(bufI==null);
     
        raster = bufI.getData();
     
      // konstruer nyt int array til billede
      imageArray = new int[ (raster.getWidth()-raster.getMinX())*
          (raster.getHeight()-raster.getMinY())*raster.getNumDataElements()*5+1];
     
      // overfør pixel data til arrayet
      imageArray = raster.getPixels(raster.getMinX(), raster.getMinY(),
          raster.getWidth(), raster.getHeight(), imageArray);
     
      // sammenlign billeder
      ens = Arrays.equals(imageArray, oldImageArray);
            if (!ens)
            {
        System.out.println("nyt billede i clipboard " + bufI);
                if (oldImageArray.length != imageArray.length)
                  oldImageArray = new int[imageArray.length];
                System.arraycopy (imageArray, 0, oldImageArray, 0, imageArray.length);
            }
            else
            {
                try { Thread.sleep(200); }
                catch ( InterruptedException ie ) {System.out.println(
                        "afbrudt" + ie); }
            }
Avatar billede codemon Nybegynder
05. marts 2003 - 22:48 #9
Det hele kører i en løkke, ens skulle hedde erEns og så meget andet.

=maddoq= jeg kunne ikke helt overskue din ide, du giver det samme array til pixel grabberen med samme start punkt. Da jeg forsøgte at bruge pixelgrabber blev PixelGrabber.getStatus() ved med at returnere 27 og getPixels kastede exception.
Avatar billede =maddog= Nybegynder
06. marts 2003 - 11:38 #10
prøv at kald Component.prepareImage() på dit billede så du er sikker på at billedet er klart.
Avatar billede codemon Nybegynder
11. marts 2003 - 01:40 #11
Der er vist fejl på eksperten, jeg får ingen tekst at se
kun tomme rammer
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester