WinFuture-Forum.de: [java] Binary String In Integer Convertieren - WinFuture-Forum.de

Zum Inhalt wechseln

Nachrichten zum Thema: Entwicklung
Seite 1 von 1

[java] Binary String In Integer Convertieren Bildbearbeitung: Farbe aus binaryString in Bild zurück schreiben


#1 Mitglied ist offline   firegate 

  • Gruppe: aktive Mitglieder
  • Beiträge: 753
  • Beigetreten: 12. April 05
  • Reputation: 0
  • Geschlecht:Männlich

geschrieben 18. Januar 2009 - 23:26

Hi Leute.

Ich versuche gerade verzweifelt, einen binaryString in einen Integer zurück zu verwandeln.

Ich habe den Farbwert eines BufferedImage ausgelesen und in einen Binärstring umgewandelt:

BufferedImage picture;
picture = ImageIO.read(new File(imgPath));

int pixel = picture.getRGB(xCoordinate,yCoordinate);
String binPixel= Integer.toBinaryString(pixel);


Danach werden die Farbwerte geändert und sollen ins Bild zurück geschrieben werden.

Das Problem ist jetzt: Zum Rückschreiben brauche ich wieder einen Integer wie den Ausgangswert.

Habt ihr eine Ahnung, wie ich das Problem lösen kann?

Ich brauche die Lösung so schnell wie möglich; am besten morgen früh.


Danke im Voraus
firegate
0

Anzeige



#2 Mitglied ist offline   Der Kenner 

  • Gruppe: aktive Mitglieder
  • Beiträge: 574
  • Beigetreten: 30. Januar 05
  • Reputation: 0

geschrieben 19. Januar 2009 - 12:13

Integer.parseInt(binPixel, 2)
0

#3 Mitglied ist offline   firegate 

  • Gruppe: aktive Mitglieder
  • Beiträge: 753
  • Beigetreten: 12. April 05
  • Reputation: 0
  • Geschlecht:Männlich

geschrieben 19. Januar 2009 - 17:51

Schmeißt leider ne NumberFormatException für den Input-String.

Sonst noch Ideen? :wink:

EDIT:

Ok, ich kann das erste "Bit" wegschmeißen und es klappt:

	public static void test()
	{
		BufferedImage picture;
		try {
			picture = ImageIO.read(new File("pixel.bmp"));
		} catch (IOException e) {
			System.out.println(e);
			e.printStackTrace();
			return;
		}
		
		int pixel = picture.getRGB(0,0);
		String anfang = Integer.toBinaryString(pixel);
		String tempString = anfang.substring(1);
		int i = Integer.parseInt(tempString,2);
		String string2 = Integer.toBinaryString(i);
		
		System.out.println("Ausgelesener Integer:" + pixel);
		System.out.println("Hin und her gewandelter Integer:" + i + " (ein Bit fehlt, darum anderer Int)");
		System.out.println("Ausgelesener String: " + anfang);
		System.out.println("Reinzuschreibender String: " + string2);
		
		picture.setRGB(0, 0, i);
		
		String ende = Integer.toBinaryString(picture.getRGB(0,0));
		System.out.println("Erneut ausgelesener String: " + ende);
		System.out.println("Stimmen die beiden überein? " + anfang.equals(ende));
		
	}

Ausgabe:
Ausgelesener Integer:-4117974
Hin und her gewandelter Integer:2143365674 (ein Bit fehlt, darum anderer Int)
Ausgelesener String: 11111111110000010010101000101010
Reinzuschreibender String: 1111111110000010010101000101010
Erneut ausgelesener String: 11111111110000010010101000101010
Stimmen die beiden überein? true


EDIT2:
Imports:
import java.awt.image.BufferedImage;
import java.io.File;
import javax.imageio.ImageIO;
import java.io.IOException;

Dieser Beitrag wurde von firegate bearbeitet: 19. Januar 2009 - 18:46

0

#4 _Fenix_

  • Gruppe: Gäste

geschrieben 25. Januar 2009 - 02:38

Hi,
Die getRGB Funktion liefert dir eine Zahl, bei der die ersten 3*8 = 24 Bits von links als die einzelnen RGB Werte gespeichert werden.
Nun verwendet Java aber die 2-er Komplement Darstellung für ganze Zahlen, sodass eine 1 im vorderste Bit als negatives Vorzeichen interpretiert wird und nur noch halb so viele positive Zahlen in einen Integer passen. parseInt kommt mit der 2er Komplement Darstellung nicht klar und nimmt an, dass die Zahl einfach zu groß ist für einen Integer. parseInt will für negative Zahlen einfach ein Minus vor der Zahl stehen haben.
Dies kann man an folgendem Code sehen:
int x = -3;
String xString = Integer.toBinaryString(x);
		
int xHelp = x*-1;
String xHelpString = Integer.toBinaryString(xHelp);
xHelpString = "-" + xHelpString;

int y = toInt(xHelpString);

System.out.println(x + " -> " + xString + " -> " + xHelp + " -> " + xHelpString + " -> " + y);


Am besten ist es, wenn du einfach eine Funktion schreibst, die dir den String selbst parst:

	
public static int toInt(String pixel) throws NumberFormatException {
   if (pixel.length() > 32)
	  throw new NumberFormatException();		
   int result = 0;
   for (int i = 0; i < pixel.length(); i++) {
	  char currentChar = pixel.charAt(i);
	  if (currentChar == '1')
		 result |= 1 << (pixel.length() - i - 1);
	  else if (currentChar != '0')
		 throw new NumberFormatException();
   }
   return result;
}


Die Funktion geht einfach den String durch und schreibt um entsprechend viele stellen nach links verschobene 1en in die Ergebnisvariable. Das hat den Vorteil, dass es vollkommen unabhängig von irgendwelchen mathematischen Eigenschaften der Zahl ist und das alle Fälle von getRGB Formaten funktionieren (teilweise werden mehr als 3 Farbkanäle zurückgegeben, wenn noch Transparenz vorliegt) :wink:.

Dieser Beitrag wurde von Fenix bearbeitet: 25. Januar 2009 - 02:51

0

#5 Mitglied ist offline   firegate 

  • Gruppe: aktive Mitglieder
  • Beiträge: 753
  • Beigetreten: 12. April 05
  • Reputation: 0
  • Geschlecht:Männlich

geschrieben 27. Januar 2009 - 23:21

Hallo Fenix, danke für deine Antwort!

getRGB gibt sogar standardmäßig den Alphawert eines BufferedImage zusätzlich zu den Farbkanälen zurück.

Deine Erklärung hat mir bei dem Verständnis des Prinzips sehr weitergeholfen.

Allerdings macht es überhaupt nichts, wenn ich einfach wie von mit beschrieben ein "Bit" wegschmeiße, da es bei *.bmp-Dateien keinen Alphawert gibt und ich momentan nur mit solchen arbeite.

Ich habe inzwischen mein Programm in einen recht brauchbarem Stadium und würde mich darüber freuen, wenn du und andere Leser es testen würden!

Ich erstelle gleich ein neues Thema und poste den Link hier noch mal.


Gruß
firegate


EDIT:
Hier der Link: Programmvorstellung: Steganoproject <_<

Dieser Beitrag wurde von firegate bearbeitet: 27. Januar 2009 - 23:38

0

Thema verteilen:


Seite 1 von 1

1 Besucher lesen dieses Thema
Mitglieder: 0, Gäste: 1, unsichtbare Mitglieder: 0