getRGB()

Status
Nicht offen für weitere Antworten.

Kaladial

Bekanntes Mitglied
moin

ich hab da nen problem mit dem befehl getRGB

also ich habe ein grauwertbild das ich analysieren will ...
dafür geh ich per doppelter for schleife jedes einzelne pixel durch und lasse mir den grauwert des pixels zurück geben ... das ergebnis stimmt aber nicht mit der aktuellen farbe überein ...

also was ich eigentlich machen will: ich geb der funktion ne binärschwelle mit und wenn die pixel dunkler sind sollen sie schwarz dargestellt werden alles andere soll weis dargestellt werden...

im saveImg is halt das bild als BufferedImage geladen (aus einem .bmp)
das problem: die system.out funktion sagt mir was von wegen das die pixel hätten ne farbe von z.b. 121 in wirklichkeit (per paint farbtabelle getestet) ist die farbe aber z.b. 66

wieso ist das so bzw wie kann ich das beheben?

code sieht so aus:

Code:
		for(int y=0; y<saveImg.getHeight(); y++){
			for(int x=0; x<saveImg.getWidth(); x++){
				Color c=new Color(saveImg.getRGB(x, y));
				System.out.println(x+" "+y+" C2:"+c.getBlue()+" "+c.getGreen()+" "+c.getRed()+" "+c.getAlpha());
				if(c.getBlue()<=binschwelle){
					int rgb=Color.black.getRGB();
					erg.setRGB(x, y, rgb);
				}else{
					int rgb=Color.white.getRGB();
					erg.setRGB(x, y, rgb);
				}
			}
		}

mfg Kala
 

Kaladial

Bekanntes Mitglied
ich hab das jetzt nochmal angeguckt ...
der wert ist auch nicht einfach nur zueinander falsch

also ich hab mal nen bild probliert und die letzten 3 pixel angeguckt

paint mein program
67 163
79 175
70 156
 

Quaxli

Top Contributor
Mir ist nicht ganz klar, welche Werte Du da vergleichst. Ich habe Dein Problem mal bei mir nachvollzogen: Es macht einen Unterschied, ob man ein RGB-Bild untersucht, das nur graue Farben enthält oder z. B. mit GIMP ein Graustaufenbild erzeugt hat.

Einen richtig tollen Hinweis habe ich bis jetzt aber leider nicht gefunden.
 

0x7F800000

Top Contributor
beim drüberschauen ist mir jetzt nichts merkwürdiges aufgefallen... Ausser in dem if-block die temporären variablen "int rgb" überflüssig sind, aber das hat ja nichts mit der funktionsweise zu tun.

Dürfte ich nochmal nachfragen, was diese Zahlen bedeuten sollen? Gibst du nur eine Komponente an oder wie ist es? Wenn ja: welche?


... ?
Und wo hast du bei Paint überhaupt eine RGB-Anzeige gefunden? ???:L
 

Kaladial

Bekanntes Mitglied
also folgendes:

ich hab 1 bild (373x76):

wenn ich das mit paint öffne und mit dem werkzeug die farbe des letzten pixels mit angucke bekomm ich den grauwert (r=g=b) 70

wenn ich nun das selbe bild per

Code:
private BufferedImage saveImg = null;  
saveImg = ImageIO.read(f);  //f = das bild

öffne und die for schleife drüber laufen lasse gibt mir meine system.out anweisung den wert 156 aus und nicht 70...

(ausgabe: 372 75 C2:156 156 156 255)

und genau das ist mein problem ...
wieso macht der das so ?
öffne ich das bild falsch oder muss ich das bufferedimage noch irgendwie definieren oder ka was da noch der fehler sein könnte...
 

Kaladial

Bekanntes Mitglied
@andrey: paint:

per phiole das pixel markieren und dann über das menü:
farbe -> palette bearbeiten -> farben definieren sieht man den eingelesenen wert...
 

Kaladial

Bekanntes Mitglied
hmmm so wie es aussieht liegt es am abspeichern des bildes ...

also dann ma ne andere frage: wie speichert man ein bild als bmp ich hab das bisher so gemacht:

Code:
	private void saveBild(){
		int pos_x=Integer.parseInt(""+model.data[4][1]);
		int pos_y=Integer.parseInt(""+model.data[5][1]);
		int size_x=Integer.parseInt(""+model.data[6][1]);
		int size_y=Integer.parseInt(""+model.data[7][1]);
		
		int bild_groesse_x=Cam.getBildBreite(0);
		int bild_groesse_y=Cam.getBildHoehe(0);
		
		int groesse=size_x*size_y;
		byte saveKlasBild[] = new byte[groesse];
		int a=0;
		int b=0;
		int x=0;
		LadeBild.Lade_Bild(0, 5);
		for(int i=0; i<LadeBild.savebild.length; i++){
			if((i>=((bild_groesse_x*pos_y+a)+pos_x))&&(i<((bild_groesse_x*pos_y+a)+(pos_x+size_x)))){
				saveKlasBild[x]=LadeBild.savebild[i];
				x++;
			}
			if(i>((bild_groesse_x*pos_y+a)+(pos_x+size_x))){
				b++;
				a=bild_groesse_x*b;
				if(b>=size_y){
					break;
				}
			}
		}
		
		BufferedImage img = new BufferedImage(size_x, size_y, BufferedImage.TYPE_BYTE_GRAY); 
		img.getRaster().setDataElements(0, 0, size_x, size_y, saveKlasBild); 
		writeIMG(img, "aktuellerFont.bmp");
	}

	public void writeIMG(BufferedImage buffimg, String fileName){
        try{
        	ImageIO.write(buffimg,"BMP",new File("font/"+fileName));
        }catch(IOException ioe){}
    }

wenn ich dieses bild nun aber mit paint öffne und dann wieder abspeichere stimmen die pixel farbwerte die mir getRGB ausgibt
 

0x7F800000

Top Contributor
okay... und wer hat recht? was sagt das auge? hast du es schon an irgendeinem einfachen beispiel ausprobiert, etwa an einem 2x2 großen bitmap mit vier pixeln rot, grün, blau & schwarz oder so? was meldet das programm dann?

...und überhaupt, wieso interessiert dich denn so sehr, was paint sagt? M$ anwendungen bauen doch andauernd irgendwelchen mist :) das betrifft insbesondere paint^^ Ich raffs nicht, seit wieviel Generationen sind die leute zu faul, um die Spray-dose irgendwie ordentlich zu implementieren, dass sie nicht diese hässliche pixelklekse liefert? Bei Ubuntu kriegt man völlig kostenlos GIMP mitgeliefert, und bei der megateueren Vista gibts immer noch nur diese hässlichen pixelklekse, merken die leute denn nicht, dass das be*#!§ene programmchen absolut für nichts zu gebrauchen ist? omfg :roll:
 

Kaladial

Bekanntes Mitglied
ok es war das abspeichern... ich habs jetzt thx ...

es lag dran das ich ein type_byte_gray als bufferedimage benutzt hab und ein type_int_rgb hätte verwenden müssen
 

Kaladial

Bekanntes Mitglied
@andrey: man muss nur wissen wie man mit windows umgehn muss dann kann man da auch so gut wie alles machen :) ich arbeite auch mit unix und muss immer noch sagen das mir windows besser gefällt ... aber is auch egal für das was ich wollte hat paint ausgereicht und hat mir den fehler gezeigt ...

und die klösung hab ich nu auch also von daher ... erledigt :)
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen

Ähnliche Java Themen


Oben