[Java] hoe lees ik pixelwaardes?

Pagina: 1
Acties:

  • Kapoen
  • Registratie: Mei 2002
  • Laatst online: 01-09 15:09
Ben nu al een tijdje aan het blokken aan mijn herexamen wiskunde :Z
en ik moet ook een stuk mathcad blokken. Tot daar geen problemen (hoop ik ;)

MathCad bezit een leuke functie waarmee je bitmap files in een matrix kan
lezen en direct de pixelwaardes kan aanpassen. Mijn vraag: is dit ook mogelijk
in Java en zoja hoe doe ik dat dan?

Clowns to the left of me, Jokers to the right


  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

Als je het plaatje inleest krijg je een Image of een ImageIcon en volgens mij kan je daar wel bij de pixels komen.

Verwijderd

http://www.xs4all.nl/~perseus/bgdraw/bgdraw.html (in action)
http://www.xs4all.nl/~perseus/bgdraw/bgdraw.java (sourcecode)
http://www.xs4all.nl/~perseus/bgdraw/ (voor alle files)

of nog kleiner example:
http://www.xs4all.nl/~perseus/zoom/ (alle files, source)

Download de source van ondergetekende en bekijk hoe de images in arrays worden geladen, die worden bewerkt en weer worden omgezet naar een plaatje dat wordt getoond.

  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

Verder zou je eventueel ook op een JCanvas ofzo kunnen kliederen.

  • Kapoen
  • Registratie: Mei 2002
  • Laatst online: 01-09 15:09
mja die PixelGrabber ziet er wel handig uit (source file uit Otis zijn post), maar die leest alle pixelwaarden in een 1-dimensionale array en daar ben ik niet veel mee spijtig genoeg. Mijn bedoeling is om alle pixels in te lezen in een 2-dimensionale array zodanig dat ik direct een stuk uit de foto kan snijden en bewerken...

Clowns to the left of me, Jokers to the right


  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

Daarvoor moet je even kijken bij een Image of ImageIcon. ik geloof dat je daar zowel kan lezen als schrijven, maar verder heb ik hier zelf nog nooit iets mee gedaan.

Verwijderd

Kapoen schreef op 12 augustus 2002 @ 11:25:
mja die PixelGrabber ziet er wel handig uit (source file uit Otis zijn post), maar die leest alle pixelwaarden in een 1-dimensionale array en daar ben ik niet veel mee spijtig genoeg. Mijn bedoeling is om alle pixels in te lezen in een 2-dimensionale array zodanig dat ik direct een stuk uit de foto kan snijden en bewerken...
een 1 dimensionaal array A[width x height] is ook te zien als A[width][height]: als je pixel (100,50) (X,Y) wilt, doe je (0,0 based) A[50 x Width + 100]. Wil je een stukje snijden uit een plaatje, dan moet je even rekenen met de width van je cutout en de delta die je overhoudt om bij de volgende row te komen van je cutout.

  • Kapoen
  • Registratie: Mei 2002
  • Laatst online: 01-09 15:09
klopt :D

volgend probleempje, die source code is een applet...en die pixelgrabber heeft absoluut een Image nodig om te werken.
In een applet kan je een Image inladen met een getImage (getDocumentBase(),...) statement, maarrrr ik ben een applicatie aan het schrijven en dit statement werkt dus niet.
Normaal gezien zou ik een ImageIcon kunnen gebruiken maar dan gaat PixelGrabber weer ff lastig doen :/

Iemand een idee hoe je toch een Image kan inlezen in een applicatie? (ik heb al gekeken op de java api site maar ik vind geen goed statement om dit te bereiken...)

Clowns to the left of me, Jokers to the right


  • Kapoen
  • Registratie: Mei 2002
  • Laatst online: 01-09 15:09
okay probleempje opgelost:

code:
1
Image mona = Toolkit.getDefaultToolkit().getImage("mona.bmp");

Clowns to the left of me, Jokers to the right


  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

Ik doe het meestal zo:
code:
1
2
3
static private ImageIcon icon = new ImageIcon(
    Editor.class.getClassLoader().getResource("com/jph/..../Caution.png")
);


En ik zet die resources gewoon in mijn jar file.

  • Kapoen
  • Registratie: Mei 2002
  • Laatst online: 01-09 15:09
natuurlijk, zo zou ik het ook doen, maar zoals ik al zei: PixelGrabber werkt niet met ImageIcons

Clowns to the left of me, Jokers to the right


  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

over het hoofd gezien ;)

  • Kapoen
  • Registratie: Mei 2002
  • Laatst online: 01-09 15:09
kan misschien ff PixelGrabber extenden en mijn eigen versie maken :D

anyways, het inlezen van een foto gaat al maar de uitvoer is nog verkeerd... ik krijg een of andere rare string ipv een gevulde array

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
public Convolutie(Image foto) {
      kopie = new ImageIcon();
      this.foto = foto;
      //this.masker = masker;
    
      kopie.setImage(foto);
      hoogte = getSize(kopie).height;
      breedte = getSize(kopie).width;
      
      pixelwaarden = new int[hoogte*breedte];
      
    }
    
    public void laadPixelsIn() {
      laadPixels = new PixelGrabber(foto.getSource(),0,0,breedte,hoogte,pixelwaarden,0,breedte);
    }
    
    public int[] geefTabel() {
      return pixelwaarden;
    }
    
    private Dimension getSize(ImageIcon i) {
      return new Dimension(i.getIconWidth(),i.getIconHeight());
    }


wat doe ik hier fout?

Clowns to the left of me, Jokers to the right


  • TaXaN
  • Registratie: April 2001
  • Laatst online: 08-09-2023
Java heeft al enige ingebouwde ondersteuning om imagemanipulatie te doen. Kijk eens naar http://www.javaworld.com/...-09-1998/jw-09-media.html

Verder moet je in jouw code nog laadPixels.grabPixels() aanroepen vooraleer de pixels werkelijk ingelezen worden. Hou je er ook rekening mee dat het inladen van een image een tijdje duurt en dat je dan natuurlijk best geen methodes gaat aanroepen. Hiervoor moet je gebruik maken van een MediaTracker.

Ik ben toevallig ook bezig met images en pixels in Java en ik heb in een klasse (onder andere) het volgende staan:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
public class DCImage {
   public DCImage(MediaTracker mt, String filename, int id) {
      mFilename = filename;
      mMt = mt;
      mId = id;
      mImage = Toolkit.getDefaultToolkit().getImage(mFilename);
      mMt.addImage(mImage,mId);
   }

   private int[] loadAndGrab() throws DCImageErrorException {
      // wait for the image to be loaded
      try {
         mMt.waitForID(mId);
      }
      catch (InterruptedException ie) {
         throw new DCImageErrorException("Loading of image "+mFilename+
        " was unexpectedly interrupted.");
     }
      // grab the pixels of the image
      int imWidth = mImage.getWidth(null);
      int imHeight = mImage.getHeight(null);
      int nbPixels = imWidth * imHeight;
      int[] pixels = new int[nbPixels]; // in RGB color space
      PixelGrabber pg = new PixelGrabber(mImage,0,0,imWidth,imHeight,pixels,0,imWidth);
      try {
         if (!pg.grabPixels()) {
        throw new DCImageErrorException("An error occurred while grabbing "+
           "the pixels of "+mFilename+".");
     }
      }
      catch (InterruptedException ie) {
         throw new DCImageErrorException("Grabbing of the pixels of "+mFilename+
       " was unexpectedly interrupted.");
      }
      return pixels;
   }

}

Verder moet je zeker eens de API docs uitpluizen; daar staat heel wat informatie in.

A polar bear is a rectangular bear after a coordinate transformation.


  • Kapoen
  • Registratie: Mei 2002
  • Laatst online: 01-09 15:09
idd, java bezit heel wat mogelijkheden om aan image bewerking te doen...
maar ik wil het liever nog manueel houden omdat dit beter past in het kader van
mijn cursus wiskunde en beeldbewerking :D

anyways tnx for the info

Clowns to the left of me, Jokers to the right

Pagina: 1