Swing Buffered Image anzeigen

Diskutiere Buffered Image anzeigen im AWT, Swing, JavaFX & SWT Bereich.
T

TImbo3

Hallo Forum,
Ich versuche gerade mit Swing ein Buffered Image zu erzeugen und es in einem JFrame anzuzeigen, aus dem Internet bin ich leider auch nicht schlau geworden.
Java:
BufferedImage br = new BufferedImage(500, 300, BufferedImage.TYPE_INT_RGB );
Damit habe ich ein Buffered Image erzeugt, aber wie kann ich das Anzeigen?

Danke
 
mihe7

mihe7

Zum Beispiel, indem Du daraus ein ImageIcon erzeugst und dieses durch ein JLabel anzeigen lässt.
Java:
JLabel imageLabel = new JLabel(new ImageIcon(br));
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
frame.add(imageLabel);
frame.pack();
frame.setVisible(true);
 
T

TImbo3

Wir hatten in der Schule in Informatik die Aufgabe ein 16*12 Bild in schwarz weiß zu Codieren und es jemanden zeichnen zu lassen, das will ich mal zum Spaß in Java machen.
 
mihe7

mihe7

Ach so. Na, dann sollte das ja genügen (ich dachte Du hättest etwas größeres vor) :)
 
T

TImbo3

Wie kann man unter Windows eigentlich eine Binärdatei erstellen, in die man auch nur 0 und 1 reinschreiben kann. Wenn ich bei einer txt Datei die Endung z.b. auf ghj ändere kann ich ja trotzdem Buchstaben reinschreiben, ich möchte aber nur 0en und 1en speichern geht das irgendwie?
 
mihe7

mihe7

Wie kann man unter Windows eigentlich eine Binärdatei erstellen, in die man auch nur 0 und 1 reinschreiben kann. Wenn ich bei einer txt Datei die Endung z.b. auf ghj ändere kann ich ja trotzdem Buchstaben reinschreiben, ich möchte aber nur 0en und 1en speichern geht das irgendwie?
Hä?!? Eine Textdatei ist eine Binärdatei, deren Inhalt einfach nur vom jeweiligen Programm (Texteditor) als Text unter Zuhilfenahme eines Zeichensatzes interpretiert wird. Ein A wird in nahezu allen Zeichensätzen als 65 kodiert und dem entsprechend gespeichert (binär 01000001).

Was willst Du denn machen?

Wenn Du binäre Daten bearbeiten willst, kannst Du Dir einen Hex-Editor besorgen. Wenn Du hart drauf bist, geht das auch in der Eingabeaufforderung mit "debug".

Wenn Du in einem Java-Programm binäre Daten schreiben und lesen willst, kannst Du das per OutputStream bzw. InputStream oder RandomAccessFile machen.
 
K

kneitzel

Wobei die Frage nicht so blöd ist. Ich kenne ich Java kein BitArray. Bei .Net gibt es ein BitArray welchem man ein ByteArray geben konnte um dann auf einzelne Bits zuzugreifen.

Aber nur weil es das im Java Framework nicht zu geben scheint, kann man sich dies ja selbst jederzeit bauen. das nte Bit kann man ja schnell ermitteln:
n/8 -> welches Byte muss ich betrachten?
n%8 -> welches Bit in dem Byte muss ich betrachten. Wobei beide Zahlen mit 0 beginnen und das n%8 kann als Anzahl der Notwendigen Shift Operationen genommen werden. Das erste Bit aus dem Byte extrahiert man dann mit dem logischen & also Byte & 1 ergibt entweder 0 oder 1 - je nachdem ob das Bit gesetzt ist oder nicht.

Somit kann ein BitArray relativ einfach selbst geschrieben werden. Und da sind dann natürlich auch relativ einfach so Dinge wie Iterator, foreach und co implementierbar.

Lesen/Schreiben geht dann - wie schon angesprochen - sehr einfach, da ja ein Array von Bytes gelesen oder geschrieben wird was ja die eigentliche Basis für alle Streams/Reader/Writer ist.
 
K

kneitzel

Ahh ... hab ich übersehen. Danke für den Hinweis. Hatte kurz gesucht und nichts gefunden (Aber habe halt nach Array und nicht nach Set gesucht).

Jetzt mehr unter dem Gesichtspunkt: Was, wenn ich so eine Klasse schreiben müsste:
Set ist irreführend, denn ein Set liegt ja nicht vor. Ein Set ist ja eine Sammlung von Objekten, deren Reihenfolge nicht festgelegt ist.
Aber bei den Bits ist die Reihenfolge ja sehr wohl wichtig und Methoden wie get(index) zeigen dies ja eigentlich auch.
 
M

mrBrown

Jetzt mehr unter dem Gesichtspunkt: Was, wenn ich so eine Klasse schreiben müsste:
Set ist irreführend, denn ein Set liegt ja nicht vor. Ein Set ist ja eine Sammlung von Objekten, deren Reihenfolge nicht festgelegt ist.
Aber bei den Bits ist die Reihenfolge ja sehr wohl wichtig und Methoden wie get(index) zeigen dies ja eigentlich auch.
Ist ein Set nicht eher einfach nur eine Menge? Also keine Duplikate, ob geordnet oder nicht ist egal.

Die Intention hinter BitSet kann ich durchaus verstehen, es ist einfach eine Menge von Bits (wobei jedes Bit einen Index hat).
Jedes Bit kann nur einmal vorkommen (zweimal „Bit 17“ geht nicht).
Reihenfolge hat es nur implizit, ebenso wie ein Set<Integer> auch eine Reihenfolge hat, iterieren in dieser Reihenfolge lässt sich aber nicht.
 
K

kneitzel

Ok, das ist auch eine interessante Sichtweise, die ich so noch nicht hatte.
 
T

TImbo3

Ich möchte für das Programm zum testen ein kleines schwarz weiß Bild binär selbst codieren. Und das dann mit java decodieren und anzeigen, allerdings scheitert es daran, eine binäre Datei anzulegen und sie in java auszulesen und dabei auch nur binäre Zahlen zu erhalten.
 
Blender3D

Blender3D

Set ist irreführend, denn ein Set liegt ja nicht vor. Ein Set ist ja eine Sammlung von Objekten, deren Reihenfolge nicht festgelegt ist.
Aber bei den Bits ist die Reihenfolge ja sehr wohl wichtig und Methoden wie get(index) zeigen dies ja eigentlich auch.
Ich halte set an dieser Stelle auch für ungünstig, da man geneigt ist das mit Menge zu übersetzen. Das wäre aus semantischer Sicht, wie Du es ja mit Deiner Argumentation richtig formuliert hast, nicht korrekt. Eine Menge aus 0 und 1 kann maximal 2 Elemente besitzen.
set kann aber auch mit dem Wort Zusammenstellung übersetzt werden. Es ist also eine Zusammenstellung von 0 und 1.
 
T

Tobias-nrw

Ich möchte für das Programm zum testen ein kleines schwarz weiß Bild binär selbst codieren
Ich frage mich gerade, wieso das allgemein irgendwer überhaupt jemals möchte :D

(Soll aber nicht heißen ich hätte keine Ahnung... habe für einen Komprimierungsalgorithmus schonmal einen Preis gewonnen)
 
mihe7

mihe7

Ich möchte für das Programm zum testen ein kleines schwarz weiß Bild binär selbst codieren. Und das dann mit java decodieren und anzeigen, allerdings scheitert es daran, eine binäre Datei anzulegen und sie in java auszulesen und dabei auch nur binäre Zahlen zu erhalten.
Java:
import java.io.*;

public class ToBinary {

    public static void main(String[] args) throws Exception {
        if (args.length != 2) {
            System.err.println("Usage: java ToBinary <input-file> <output-file>");
            System.exit(1);
        }

        try(FileReader reader = new FileReader(args[0]);
                FileOutputStream fos = new FileOutputStream(args[1])) {
            int ch;
            byte b = 0;
            int bit = 0;
            while ((ch = reader.read()) != -1) {
                if (ch == '0' || ch == '1') {
                    b <<= 1;
                    if (ch == '1') {
                        b |= 1;
                    }
                    bit++;
                    if (bit == 8) {
                        bit = 0;
                        fos.write(b);
                    }
                }
            }
        }
    }
}
Dem Teil gibst Du nun eine Textdatei die so aussieht:
Code:
00000000 00000000 00000000
00000000 00011000 00000000
00000000 00111100 00000000
00000000 01111110 00000000
00000000 11011011 00000000
00000001 10011001 10000000
00000001 11011011 10000000
00000000 11011011 00000000
00000000 01111110 00000000
00000000 00111100 00000000
00000000 00011000 00000000
und das schreibt Dir den Spaß dann binär weg.
 
T

TImbo3

Rheinwerk Computing :: Java ist auch eine Insel - 20.6 Bilder
Da findet sich eigentlich alles. Lesen und schreiben von Bildern, verändern von Bildern über Graphics und auch Manipulation von einzelnen Pixeln.

Reicht das schon oder was fehlt Dir da noch?
Das ist nicht das Problem das funktioniert, ich will nur wissen wie ich die Daten aus einer binären Datei in mein Programm kriege.
Der Code soll so funktionieren.
Die ersten 15 Bit geben die Höhe des Bildes an und die zweiten die Breite des Bildes. Und alle Bits danach ob der Bildpunkt schwarz oder weiß ist, dabei steht eine 1 für weiß und eine 0 für schwarz.
Beispiel:
Höhe 4 Pixel: Breite 8 Pixel: Das Bild selbst. Das Bild würde also so aussehen:
000000000000100 000000000001000 11110000110000111111000011000011
Das "Bild" würde also in etwa so aussehen:

12328
Und diese Binärzahlen würde ich gerne in eine Datei schreiben und mit Java zu einem Bild verarbeiten.
 
mihe7

mihe7

Und wie soll ich die selbst bearbeiten? mit 0en und 1 en?
Was willst Du daran denn bearbeiten? Du hast doch eine Textdatei in eine binäre umgewandelt (btw: Du musst 8-Bit-Gruppen auffüllen)

Du schreibst als Text
Code:
00000000 00001000 00000000 00100011 11000011 00001111 11000011 00001100
In der Ausgabedatei werden dem entsprechend die Bytes 0, 8, 0, 35, 195, 15, 195, 12 geschrieben. Wenn Du Dir die Datei mit einem Hex-Editor ansiehst, wirst Du dem entsprechend 00 08 00 23 c3 0f c3 0c sehen.
 
mihe7

mihe7

Um das (ggf. für die Nachwelt) nochmal klar zu stellen: wenn Du folgende Eingabedatei verwendest:
Code:
00000000 00001000 00000000 00000100
00001111
00111100
00001111
00111100
Dann kannst Du mit dem Code aus Kommentar #21 daraus eine Binärdatei erstellen. Diese besteht dann aus den Bytes (Angabe hexadezimal) 00 08 00 04 0f 3c 0f 3c. Die ersten beiden Bytes geben die Breite, die nächsten beiden die Höhe des Bildes an. Der Rest sind die Bildinformationen (s/w-Pixel).

Eine solche Datei kannst Du z. B. mit folgender Klasse als BufferedImage einlesen:

Java:
import java.awt.*;
import java.awt.image.*;
import java.io.InputStream;
import java.io.IOException;
import java.util.Hashtable;

public class SimpleImageFormat {
    private static class Reader {
        private InputStream is;
        public Reader(InputStream is) { this.is = is; }

        public BufferedImage read() throws IOException {
            int width = readShort();
            int height = readShort();
            byte[] buf = new byte[width*height];
            is.read(buf);
            return createImage(width, height, buf);
        }

        private BufferedImage createImage(int w, int h, byte[] buf) {
            DataBufferByte db = new DataBufferByte(new byte[][]{buf}, buf.length);
            MultiPixelPackedSampleModel model = new MultiPixelPackedSampleModel(
                    DataBuffer.TYPE_BYTE, w, h, 1);
            WritableRaster raster = Raster.createWritableRaster(model, db, new Point(0,0));
            byte[] cols = {(byte) 0xff, 0};
            IndexColorModel cm = new IndexColorModel(1, 2, cols, cols, cols);
            return new BufferedImage(cm, raster, false, new Hashtable<>());
        }

        private int readShort() throws IOException {
            int msb = is.read();
            int lsb = is.read();
            return (msb << 8) | lsb;
        }
    }

    public BufferedImage read(InputStream is) throws IOException {
        return new Reader(is).read();
    }
}
(Den Writer überlasse ich Dir; natürlich kannst Du die Reader-Klasse auch rausziehen)
 
T

Trjavnamen

Ich frage mich gerade, wieso das allgemein irgendwer überhaupt jemals möchte
Im allgemeinen würde ich sagen das, das der Vorläufer des QrCodes ist. Das ist im Grunde eine Gridpane mit schwarz/weißen Flächen. Die Begrenzungspunkte werden mit den ersten zwei Werten berechnet und er Rest nach Bit gesetzt . In Methoden wird dann festgesetzt welche Bits in welcher Länge dann für welchen Wert stehen. Die ersten 8 Bits z.B. ergibt die Kategorie = 128 Kategorien. Kategorien könnte sein HTTP,HTTPS,IP,WWW. ,Port:,usw..........
 
Zuletzt bearbeitet von einem Moderator:
T

Trjavnamen

Oder eine Gridpanecelle (mit Transparenten dicken Rand) ist ein Byt mit 4 Balken die jeweils die Farbe weiß und schwarz annehmen.
 
Zuletzt bearbeitet:
T

Tobias-nrw

Uff das ist schon einen Monat her, hast Du denn jetzt noch Fragen? ja? => welche?
 
T

Trjavnamen

sorry eine Randbemerkung zum Thema und deiner Frage......... Verwendung einer Umwandlung eines Binär Textes in farbige Kästchen und wer es braucht. Es schon benutzt. Denke mal anders..z.B. an Abarbeitung von Arztikellisten mit immer den selben Inhalt bis auf Artikelnummer und Preis. oder Geheimübermitlung von Firmendaten mittels Grafik und eigenem Entschlüssler.
 
mihe7

mihe7

Die geheime Information in dem Bild ist, dass es zum Frühstück Toast gab? :)
 
K

kneitzel

NB: Für "geheim" nimmt man bekannte Algorithmen mit starken Schlüsseln und keine selbstgebauten Bildchen.
Wobei Daten in einem selbstgebauten Bildchen durchaus sicher sein können, siehe Steganographie.
Aber da zieht dann natürlich Dein Hinweis bezüglich bekannter Algorithmen und das ist nicht mehr die vom TE angeführte reine Konvertierung von Rohdaten in ein Bild ....
 
T

Tobias-nrw

Java:
import java.awt.image.BufferedImage;
import java.io.File;
import javax.imageio.ImageIO;

public class Bilder {

	public static void longToImg(BufferedImage i, long l) {
		String h = String.format("%64s", Long.toBinaryString(l)).replace(' ', '0');
		System.out.println(h);
		int a = 0;
		int z = 1;
		for (int x = 0; x < i.getWidth(); x++) {
			for (int y = 0; y < i.getHeight(); y++) {
				if (z % 7 == 0) {
					int rgb = i.getRGB(x, y);
					if (h.charAt(a) == '0') {
						if (rgb % 2 != 0) {
							rgb++;
						}
					} else {
						if (rgb % 2 == 0) {
							rgb++;
						}
					}
					i.setRGB(x, y, rgb);
					a++;
					if (a == 64) {
						return;
					}
				}
				z++;
			}
		}
	}

	public static long longFromImg(BufferedImage i) {
		String h = "";
		int a = 0;
		int z = 1;
		for (int x = 0; x < i.getWidth(); x++) {
			for (int y = 0; y < i.getHeight(); y++) {
				if (z % 7 == 0) {
					int rgb = i.getRGB(x, y);
					if (rgb % 2 == 0) {
						h += "0";
					} else {
						h += "1";
					}
					a++;
					if (a == 64) {
						return Long.parseLong(h, 2);
					}
				}
				z++;
			}
		}
		return Long.parseLong(h, 2);
	}

	public static long longFromString(String s) {
		String h = "";
		for (char c : s.toCharArray()) {
			String r = Long.toBinaryString(c);
			if (r.length() < 8) {
				r = String.format("%8s", r).replace(' ', '0');
			} else {
				r = r.substring(r.length() - 8);
			}
			h += r;
		}
		return Long.parseLong(h, 2);
	}

	public static String longToString(long l) {
		String h = String.format("%64s", Long.toBinaryString(l)).replace(' ', '0');
		String s = "";
		for (int i = 0; i < 8; i++) {
			s += (char) Long.parseLong(h.substring(i * 8, i * 8 + 8), 2);
		}
		return s;
	}

	public static void main(String[] args) throws Exception {
		BufferedImage i = ImageIO.read(new File("x.png"));
		longToImg(i, longFromString("        "));
		ImageIO.write(i, "PNG", new File("y.png"));
		Thread.sleep(1000);
		i = ImageIO.read(new File("y.png"));
		System.out.println(longToString(longFromImg(i)));
	}

}

Ihr könnte ja mal schauen welches Wort (8 Buchstaben) sich hinter diesem Bildchen verbirgt (man denke an jedes 7. Ü-Ei....):

1234.png
 
T

Tobias-nrw

Aber tatsächlich, diese Bildchen sind derzeit ein riesiges Problem in online Spielen, bei denen es die Möglichkeit gibt, Graffitis an Wände zu sprühen, da somit verbotene Symbole oder Texte ausgetauscht werden können... Aufgrunddessen ist das in manchen online Spielen nicht mehr erlaubt.

Jetzt könnten wir darüber philosophieren, welche Meinung ihr dazu habt...
 
T

Trjavnamen

Sorry ich lerne. Alles ist von den US Sicherheitsfirmen knackbar. Alle relevanten Firmen geben Ihnen Hintertürchen. Selbst Appel kann sich nicht dagegen stellen. Deshalb gibt es ja auch Appel for Windows und keinen Stick mit Eigensoftware die direkt gebootet und zum verwalten von Daten benutzt wird. Natürlich die Apps die sowohl unter Appel alsauch auf anderen Systemen laufen machen Appel angreifbar. Diese Apps liefern mit Sicherheit diese Lücke. Java wird auch dazu gehören. Das Orakel einen Dekompiler hat der Compilierte Programme wieder lesbar macht ist anzunehmen oder was meint Ihr? Wer den Sourcecode erfunden hat weiß wie man den Ursprung wieder herstellt oder?
 
T

Tobias-nrw

Naja das bei Java ein DECOMPILER dabei ist, ist ein offenes Geheimnis. Du kannst natürlich jede jar oder class Datei zurückübersetzen und schauen was sie tut.
 
T

Trjavnamen

Nun es wird nicht propagiert. Ich beschäftige mich länger und meist sporadisch(mangelsZeit mit diesem Thema und aus meiner Amigaxp Zeit weiß ich noch das es sowas gab und erlaubt war. Aber das es heute noch offen gibt ist mir nicht Bewust. Oder muß ich fragen es ist illegal so eine Software zu haben oder?
 
mihe7

mihe7

Alles ist von den US Sicherheitsfirmen knackbar.
In der Theorie ist alles knackbar. Das ist auch der Grund, warum die verwendeten Verfahren öffentlich bekannt sein und starke, geheime Schlüssel verwendet werden sollen (https://de.wikipedia.org/wiki/Kerckhoffs’_Prinzip).

Alle relevanten Firmen geben Ihnen Hintertürchen.
Wenn ich jemandem meinen Haustürschlüssel in die Hand drücke, dann würde ich es nicht als Knacken des Schlosses bezeichnen, wenn der Schlüssel verwendet wird. Außerdem ist das ein gutes Beispiel dafür, warum man öffentlich bekannte Verschlüsselungsalgorithmen (und nicht irgendein geheimes Verfahren eines Firma) verwenden sollte.

Das Orakel einen Dekompiler hat der Compilierte Programme wieder lesbar macht ist anzunehmen oder was meint Ihr?
Äh, der Quellcode wird auch nicht zwecks Geheimhaltung in Bytecode übersetzt. Es gibt genügend Decompiler, auch für Java. Im JDK ist ein Disassembler gleich dabei.

Wer den Sourcecode erfunden hat weiß wie man den Ursprung wieder herstellt oder?
Ich weiß zwar nicht genau, was Du meinst, aber die Übersetzung von Source- in Bytecode ist keine bijektive Abbildung, da dabei viele Informationen des Quellcodes verloren gehen.
 
mihe7

mihe7

Nun es wird nicht propagiert. Ich beschäftige mich länger und meist sporadisch(mangelsZeit mit diesem Thema und aus meiner Amigaxp Zeit weiß ich noch das es sowas gab und erlaubt war. Aber das es heute noch offen gibt ist mir nicht Bewust. Oder muß ich fragen es ist illegal so eine Software zu haben oder?
Was heißt, es wird nicht propagiert? Wenn Du die Doku liest, findest Du ihn, die Java-Insel hat auch einen Abschnitt darüber. Nur das allgemeine Interesse hält sich in Grenzen, weil es viele einfach nicht brauchen.

Natürlich ist es nicht illegal, einen Decompiler/Disassembler zu besitzen. Du darfst sie nur nicht rechtswidrig einsetzen.
 
K

kneitzel

Bezüglich Decompiler und Disassembler:
Also wirklich hart wird es ja auch erst, wenn es um optimierte Low Level Binaries geht. Aber da gibt es jetzt auch ein freies 1a Tool (Sowas war vorab nur gewerblich für sehr viel Geld verfügbar): Ghidra, entwickelt von der NSA: https://www.nsa.gov/resources/everyone/ghidra/

Also von der Idee, dass man Source Code schützen kann, sollte man sich verabschieden.

Zumal hinzu kommt, dass der Code weniger wert ist, als eben die Idee. Und so eine Idee wird schnell kopiert. Sieht man doch im App Store regelmäßig: Kaum gibt es eine neue Idee, dann kommen im Nu massiv Clones davon in den App Store.
 
Thema: 

Buffered Image anzeigen

Passende Stellenanzeigen aus deiner Region:
Anzeige

Neue Themen

Anzeige

Anzeige
Oben