Byte-Manipulation eines Bildes

Semox

Bekanntes Mitglied
Hallo Forum

Ich habe eine Frage. Kann mir jemand bitte erklären, warum die Verschieberei von Bytes in einem Bild ein Blöckchenmuster in einem neu generierten Bild bedeutet?

Java:
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

/**
 * Bytes werden aus Bild-Datei gelesen; einzelne Bytes werden veraendert und
 * wieder in Datei gespeichert.
 * 
 * @author skalt
 * @version 2.0 07/2009 Copyright Beuth Hochschule fuer Technik 2009
 */
public class BinaerDatenManipulieren {

	/**
	 * Main-Methode.
	 * 
	 * @param args
	 *            Uebergabeparameter
	 * @throws IOException
	 */
	public static void main(String[] args) throws IOException {
		// Dateiname des Originalbildes
		String bildDateiOriginal = "AbbWurfparabel.jpg";
		// Dateigroesse - Angabe wichtig fuer Laenge des Byte-Arrays
//		int dateiGroesse = 14720;
		// Dateiname des Bildes mit den manipulierten Bytes
		String bildDateiGeand = "AbbWurfparabel_new.jpg";
		// Methode zum Manipulieren von Bytes im Originalbild aufrufen
		manipuliereBytesInBild(bildDateiOriginal, bildDateiGeand/*, dateiGroesse*/);
	}

	/**
	 * Methode zum Manipuliere einzelner Bytes in einem Bild. Das manipulierte
	 * Bild wird unter dem uebergebenen neuen Dateinamen abgespeichert.
	 * 
	 * @param bildDateiOriginal
	 *            Dateiname des Originalbildes
	 * @param bildDateiGeand
	 *            Dateiname des Bildes mit den manipulierten Bytes
	 * @param int dateiGroesse Dateigroesse des Originalbildes in Byte
	 * @throws IOException
	 */
	public static void manipuliereBytesInBild(String bildDateiOriginal,
			String bildDateiGeand/*, int dateiGroesse*/) throws IOException {
		// Datei einlesen - Eingabestroeme oeffnen
		FileInputStream fiStream = new FileInputStream(bildDateiOriginal);
		DataInputStream diStream = new DataInputStream(fiStream);

		// Byte-Array entsprechend der Dateigroesse des Originalbilds erzeugen
		File dat = new File(bildDateiOriginal);
		long length = dat.length();
		byte[] byteA = new byte[(int) length];
		// Bytes mittels read() in das Byte-Array einlesen
		diStream.read(byteA);
		// Eingabestrom schliessen
		diStream.close();

		// Bytes an einzelnen Positionen aendern
		byteA[60] = -126;
		byteA[1060] = 126;
		byteA[1400] = -112;

		// neue Datei erzeugen - Ausgabestroeme oeffnen
		FileOutputStream foStream = new FileOutputStream(bildDateiGeand);
		DataOutputStream doStream = new DataOutputStream(foStream);

		// Bytes in neue Datei speichern
		doStream.write(byteA);
		// Bytes aus internem Puffer in den FileOutputStream schreiben
		doStream.flush();
		// Ausgabestrom schliessen
		doStream.close();

		// Benutzerausgabe
		System.out.println("Geaendertes Bild wurde in die Datei '"
				+ bildDateiGeand + "' gespeichert.");
	}
}

Herzlichen Dank,
Semo

P.S. Anbei das zu manipulierende JPEG.
 
S

SlaterB

Gast
ein JPEG ist doch wirklich ein komplexes Ding
JPEG ? Wikipedia
jedes Byte kann da auf wer weiß wie viel Zeilen/ Spalten usw. Auswirkung haben, auf keinen Fall beschreibt es einen einzelnen Bildpunkt,

da finde ich diese Reaktion schon passend und noch freundlich,
im schlimmsten Fall könnte sich das Bild gar nicht mehr darstellen lassen, wenn man in einem geordneten System irgendwo was ändert

vielleicht möchtest du das Bild erst in ein Raster umrechnen, dann einen Punkt ändern und daraus ein neues Jpeg generieren?
möglich wär das sicher, aber Code kann ich dir dazu gerade nicht nennen
 

Marco13

Top Contributor
Der Code dazu wäre grob sowas wie
Code:
BufferedImage image = ImageIO.load(inputFile);
in.setRGB(x,y,rgb);
ImageIO.write(image, "jpg", outputFile);

Und das das ändern der Bytes nicht kracht ist wirklich Glück ;)
 

erxx

Mitglied
dann speichert man es eben als PNG ab ;)
da JPG schon verlustbehaftet ist, finde ich diesen Einwand irgendwie komisch

JPG ist nicht zwanghaft verlustbehaftet, JPEG ist ja ansich nur eine Ansammlung von applizierten Kompressionsverfahren... wenn ich mich richtig erinnere kann es nur bei der YUV Umwandlung und bei der Quantisierung zu einem Verlust kommen.

Dies kann man soweit ich weiß bei guten Bildbearbeitungsprogrammen mit einem Qualitätsregler einstellen.

Besser hierfür wäre aber definitiv PNG um auf Nummer sicher zu gehen
 

Wookie81

Aktives Mitglied
Ja und beim subsampling .. könnte aber wirklich sein, dass kein Qualitätsverlust entsteht wenn man nur einzelne Pixel ändert (da alle Zahlen eh schon recht passend gerundet sind). Ich dachte Semox wollte wirklich was im Bild verschieben und dann würden die 8x8 Blöcke nicht mehr passen.

Damit zurück zum Thema: Klappt alles Semox?

Wk
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
LucasGlockner Effizienter byte-Zugriff auf ein long[]-Array Allgemeine Java-Themen 8
Encera Größe eines Objektes in Byte berechnen Allgemeine Java-Themen 2
M Optimierung einer Methode (byte-Geraffel) Allgemeine Java-Themen 2
Noahscript Aus einem byte Array Steuerungszeichen und Code bekommen und ersetzen Allgemeine Java-Themen 3
Thallius unsigned byte Allgemeine Java-Themen 18
N Byte Array in Java "dekomprimieren" Allgemeine Java-Themen 3
kodela Datentypen byte als unsigned interpretieren Allgemeine Java-Themen 23
W String -> byte[] -> String - Sieht jemand was ich nicht sehe? Allgemeine Java-Themen 10
TheWhiteShadow 2D-Grafik GIF Library mit byte output Allgemeine Java-Themen 10
K Data Konverter - Probleme mit Byte[] Kodierung Allgemeine Java-Themen 3
kodela Byte Order Mark (BOM) bei readLine() ignorieren Allgemeine Java-Themen 5
A Byte zu String Allgemeine Java-Themen 4
RalleYTN Datentypen Unsignierter Byte zum signierten Byte Allgemeine Java-Themen 2
X Datentypen Byte geht nicht höher als 126 auch nicht mit casten? Allgemeine Java-Themen 22
R Byte Array Zeichensuche Allgemeine Java-Themen 6
M Null byte in verschiedenen charsets Allgemeine Java-Themen 2
S Byte Array welches in Laufzeit aufgelöst wird // Objekt Array Allgemeine Java-Themen 3
O Byte-Array zu String Allgemeine Java-Themen 7
D Decodierung von Mp3-byte[] Allgemeine Java-Themen 4
A ByteBuffer.get(byte[] dst,int offset,int length) Allgemeine Java-Themen 2
A RandomAccessFile.read(byte[] b) Allgemeine Java-Themen 9
P Datentypen Warum überhaupt Byte ? Allgemeine Java-Themen 12
P Datentypen String-Daten zu Byte-Zahlen konvertieren - Komme nicht weiter nach vielem versuchen :-/ Allgemeine Java-Themen 7
E Byte zu String & umgekehrt Allgemeine Java-Themen 3
B BufferedWriter in InputStream oder Zeichen-Stream in Byte-Stream Allgemeine Java-Themen 5
M Chart per byte[] in JSP anzeigen Allgemeine Java-Themen 4
E int in byte Allgemeine Java-Themen 6
R ArrayList byte[] abspeichern Allgemeine Java-Themen 4
S byte [] in string und zurück konvertieren Allgemeine Java-Themen 2
G byte ? : Allgemeine Java-Themen 7
E Byte-Array to String: Zeichenkaputt Allgemeine Java-Themen 11
R In einem Byte-Array nach einer gewissen Zahlenfolge suchen Allgemeine Java-Themen 7
hdi Speicherbelegung byte, short, int Allgemeine Java-Themen 8
J byte - hex - byte.. casten Allgemeine Java-Themen 8
R byte[] to String Konvertieren Allgemeine Java-Themen 14
A Input/Output Buffered Image zu Byte Array und zurück konvertieren Allgemeine Java-Themen 4
M byte array splitten Allgemeine Java-Themen 3
J Hex-String zu byte transformieren Allgemeine Java-Themen 7
T Zu doof für byte-Umrechnung ... Allgemeine Java-Themen 3
W CRC32 aus byte array Allgemeine Java-Themen 5
F byte[] aus einem BufferedImage Allgemeine Java-Themen 3
L byte -> byte[1] -> byte Allgemeine Java-Themen 2
P Einzelne Bits in einem Byte-Array setzen Allgemeine Java-Themen 2
Kr0e Synchronisieren: boolean,byte,char ? Allgemeine Java-Themen 2
S Überprüfung/Parsen eines Byte-Arrays Allgemeine Java-Themen 9
Meldanor For-Schleifen - byte statt int? Allgemeine Java-Themen 11
C int zu byte cast - verständnis Allgemeine Java-Themen 3
R int to byte[] Array Allgemeine Java-Themen 4
MQue byte[] Array to Integer Allgemeine Java-Themen 4
MQue Byte to Int convertieren Allgemeine Java-Themen 2
R Double Werte aus byte[] auslesen Allgemeine Java-Themen 5
W Verwendung von byte Allgemeine Java-Themen 9
G zu lange Byte code dateien Allgemeine Java-Themen 6
G String in byte- Array Allgemeine Java-Themen 3
E Byte [] nach hex, dann nach dec Allgemeine Java-Themen 2
A Performance: byte[] in byte[][][] konvertieren Allgemeine Java-Themen 2
G 2 x byte zusammenkopieren Allgemeine Java-Themen 7
G byte nach int Allgemeine Java-Themen 3
foobar Object to byte[] ohne Serializable Allgemeine Java-Themen 6
data89 Die Größe eines Strings in Byte berechnen? Allgemeine Java-Themen 12
G Byte- List mit einem Iterator durchlaufen Allgemeine Java-Themen 5
W Konflikt byte->int, in.read->arraycopy Allgemeine Java-Themen 7
T "unsigned" byte[] -> BigInteger Allgemeine Java-Themen 2
F byte in hex-String oder: Wer hat in Mathe aufgepasst Allgemeine Java-Themen 3
T Socket Server Anwendung - Empfang eines Byte-Arrays Allgemeine Java-Themen 7
J NumberFormatException bei String->byte[] Allgemeine Java-Themen 12
ARadauer Blob aus byte Array erstellen? Allgemeine Java-Themen 3
T Object -> byte[] Allgemeine Java-Themen 5
G Byte[] zeichenweise lesen Allgemeine Java-Themen 4
G byte[] mit Strings füllen Allgemeine Java-Themen 2
B int -> byte Allgemeine Java-Themen 2
G file --> byte[] Allgemeine Java-Themen 7
E Problem beim Dateien kodieren ("Byte = Byte +1") Allgemeine Java-Themen 3
I String -> byte[] -> String Allgemeine Java-Themen 2
D byte nach integer? Allgemeine Java-Themen 4
MQue int in byte Allgemeine Java-Themen 18
G Maximalgröße von byte[] buffer Allgemeine Java-Themen 7
E String -> byte[] Allgemeine Java-Themen 6
C Byte[] to String Allgemeine Java-Themen 7
D datei in byte[]-array schreiben Allgemeine Java-Themen 6
D byte[] problem Allgemeine Java-Themen 3
MQue ArrayList in ein byte- Array Allgemeine Java-Themen 7
B ein spezielles Byte-Array sortieren Allgemeine Java-Themen 11
T OutputStream - Event bei Byte-Fluss Allgemeine Java-Themen 5
J byte-Array in Hashmap speichern? Allgemeine Java-Themen 3
S Problem beim Einlesen von byte-werten aus datei Allgemeine Java-Themen 2
J byte-Array als String übers http schicken Allgemeine Java-Themen 8
F List<String> zu byte[] Allgemeine Java-Themen 7
L byte vs. int Allgemeine Java-Themen 6
G Umwandlung Byte in Integer Allgemeine Java-Themen 12
N Byte-Code entschlüsseln (Bitmasks?) Allgemeine Java-Themen 3
R byte - string? Allgemeine Java-Themen 10
R Stream Byte für Byte durchgehen Allgemeine Java-Themen 5
S java.io.InputStream.read(byte[] b) überschreiben Allgemeine Java-Themen 33
B boolean array = byte array (platzverbrauch) Allgemeine Java-Themen 6
L byte[] to int Allgemeine Java-Themen 2
M Vector zu einem byte[] Allgemeine Java-Themen 5
C Byte Array aus Datei erzeugen Allgemeine Java-Themen 6
T BufferedImage aus einem byte-Array? Allgemeine Java-Themen 2
B Problem mit Einlesen vom Byte FF aus Dateien Allgemeine Java-Themen 5

Ähnliche Java Themen

Neue Themen


Oben