Bild Pixelweise auslesen

PixelHD

Mitglied
Hallo ,

ich habe ein Problem ich möchte ein Bild einlesen und das Bild einmal Pixel für Pixel durchgehen und nach einer Farbe suchen wenn die gefunden wird soll die Farbe auf Transparent geändert werden sodass nur die eigentliche Grafik da ist. In meinem Spiel setzte ich auf Canvas. Ich habe hier mal ein Beispiel Bild.

Im ersten Kästchen soll die Grüne Farbe rausgefiltert werden, sodass nur die 3 gelben Kreise im Spiel zu sehen sind. Ich weiß jedoch nicht wie ich ein Bild Pixel für Pixel einlese und wie ich eine bestimmte Farbe dann ändere.

Ich hoffe ihr habt Ideen und könnt mir bei meinem Problem helfen.

MFG ThePixel5D
 

Fu3L

Top Contributor
Einfachstes Beispiel:

Java:
BufferedImage img = Dein Bild;
int yourColor = new Color(255, 0, 255).getRGB();
int newColor = new Color(0, 255, 255).getRGB();
for(int x = 0; x < img.getWidth(); x++) {
  for(int y = 0; y < img.getHeight(); y++) {
     if(img.getRGB(x, y) == yourColor) {
         img.setRGB(x, y, newColor);
     }
  }
}

Ersetzt jedes Vorkommen von der allgemein für Transparenz verwendeten Farbe 255, 0, 255 durch Cyan.
Einigen Methodennamen könnten leicht anders lauten (vllt toRGB()?), das hab ich nicht im Kopf.

Edit: Da du Transparenz möchtest, müsstest du natürlich Color mit 4 Argumenten konstruieren^^
 
Zuletzt bearbeitet:

PixelHD

Mitglied
Danke für die Hilfe ich habe auch den Tipp mit dem 4 Argument befolgt jedoch bleibt der Hintergrund schwarz oder weiß und bei anderen Wert passiert einfach nichts die Farbe wird nicht rausgefiltert nur wenn ich (0,0,0,0) o. (255,255,255,255) nehme.



So sieht es momentan aus jedoch sollte das schwarze durch Grau erstetzt werden. Sodass es wirklich transparent ist.

So schaut mein Code aus

Java:
int col = new Color(87, 0, 127, 255).getRGB();
		int col2 = new Color(0, 0, 0, 0).getRGB();
		for (int x = 0; x < img.getWidth(); x++) {
			for (int y = 0; y < img.getHeight(); y++) {
				if (img.getRGB(x, y) == col) {
					img.setRGB(x, y, col2);
				}
			}
		}
		return img;
	}

MFG Pixel
 

Fu3L

Top Contributor
Könnte es daran liegen, dass du darauf prüfst, obs Grau ist und das schwarz machst, anstatt wie gewünscht auf Schwärze zu prüfen und diese durch Grau zu ersetzen?^^
 

PixelHD

Mitglied
Ich prüfe den RGB Wert (87,0,127) und ersetzte die Farbe mit (0,0,0,0) was eigentlich schwarz ist aber durch das 4. Argument sollte es doch transparent sein oder nicht ? Ich kann auch nicht mit einem "Player" (das rote Viereck) hinter die Schrift fahren dann sehe ich ihn nämlich nicht mehr. Die Farbe an sich wird aber richtig erkannt.

MFG
 

Fu3L

Top Contributor
Also dashier funktioniert wunderbar mit deinem Bild. Der graue Hintergrund (51, 51, 51) wird transparent und lässt das rote Panel durchscheinen.

Kleiner Tip: Nicht als jpg speichern, die ändern gerne mal die Farbe leicht (ist hier nicht das Problem, wollts nur so gesagt haben)

Java:
import java.awt.Color;
import java.awt.Graphics;
import java.awt.image.BufferedImage;

import javax.swing.JFrame;
import javax.swing.JPanel;

import tools.ImageTools;

public class ImageReplacement extends JPanel {
	BufferedImage img;

	public ImageReplacement() {
		this.setBackground(Color.RED);
		img = ImageTools.getInstance().getImage("Unbenannt.png");
		int col = new Color(51, 51, 51, 255).getRGB();
		int col2 = new Color(0, 0, 0, 0).getRGB();
		for(int x = 0; x < img.getWidth(); x++) {
			for(int y = 0; y < img.getHeight(); y++) {
				if(img.getRGB(x, y) == col) {
					img.setRGB(x, y, col2);
				}
			}
		}
	}

	public static void main(String[] args) {
		JFrame f = new JFrame();
		f.setSize(500, 500);
		f.add(new ImageReplacement());
		f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		f.setVisible(true);
	}

	@Override
	protected void paintComponent(Graphics g) {
		// TODO Auto-generated method stub
		super.paintComponent(g);
		g.drawImage(img, 0, 0, null);
	}

}
 

PixelHD

Mitglied
Komisch den Code kann ich garnicht ausführen.



Auf diesem Bild sieht man auch mal die PNG Datei (ein Teil davon) es sollen ja zwei Farben gefiltern werden habe ich auch soweit ohne Probleme geschafft
Java:
int col = new Color(87, 0, 127).getRGB();
		int col2 = new Color(178, 0, 255, 255).getRGB();
		int col3 = new Color(0, 0, 0, 0).getRGB();
		for (int x = 0; x < img.getWidth(); x++) {
			for (int y = 0; y < img.getHeight(); y++) {
				if (img.getRGB(x, y) == col || img.getRGB(x, y) == col2) {
					img.setRGB(x, y, col3);
				}
			}
		}

Nur es wird nicht transparent warum weiß ich nicht.

EDIT://

Kann es vielleicht sein das er mit .setRGB/.getRGB nur die ersten 3 Werte nimmt ?
 

Fu3L

Top Contributor
Der Code oben wird nicht ausführbar sien, weil die Methode zum Laden der Bilder eine meiner eigenen Klassen ist, ich kopiers mal direkt rein.
Ich vermute, dass es am Typ des BufferedImages liegt.

Hier im File sind zwei Möglichkeiten zum Laden, die kürzere habe ich unkommentiert gelassen. Das Auskommentierte wäre die zweite Möglichkeit. Das zweite verwende ich seit Jahren so, weils eine Klasse ist, die Quaxlie in seinem Spieletutorial vorstellt, aber die erste Methode ist hier ebenso angemessen.

Beachte besonders das TYPE_INT_ARGB.

Java:
import java.awt.Color;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.net.URL;

import javax.imageio.ImageIO;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class ImageReplacement extends JPanel {
	BufferedImage img;

	/*private static GraphicsEnvironment ge;
	private static GraphicsConfiguration gc;

	static {

		//GraphicsConfiguration für VolatileImage
		ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
		gc = ge.getDefaultScreenDevice().getDefaultConfiguration();

	}*/

	public ImageReplacement() {
		this.setBackground(Color.RED);
		URL location = getClass().getClassLoader().getResource("Unbenannt.png");
		BufferedImage pic = null;
		try {
			pic = ImageIO.read(location);
		} catch (Exception ex) {
			System.out.println("Fehler beim Laden: " + ex);
		}

		/*img = gc.createCompatibleImage(pic.getWidth(), pic.getHeight(), Transparency.BITMASK);
		Graphics g = img.getGraphics();
		g.drawImage(pic, 0, 0, null);*/
		img = new BufferedImage(pic.getWidth(), pic.getHeight(), BufferedImage.TYPE_INT_ARGB);
		Graphics g = img.getGraphics();
		g.drawImage(pic, 0, 0, null);
		int col = new Color(51, 51, 51, 255).getRGB();
		int col2 = new Color(0, 0, 0, 0).getRGB();
		for(int x = 0; x < img.getWidth(); x++) {
			for(int y = 0; y < img.getHeight(); y++) {
				if(img.getRGB(x, y) == col) {
					img.setRGB(x, y, col2);
				}
			}
		}
	}

	public static void main(String[] args) {
		JFrame f = new JFrame();
		f.setSize(500, 500);
		f.add(new ImageReplacement());
		f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		f.setVisible(true);
	}

	@Override
	protected void paintComponent(Graphics g) {
		// TODO Auto-generated method stub
		super.paintComponent(g);
		g.drawImage(img, 0, 0, null);
	}

}
 

PixelHD

Mitglied
Danke ich schätze mal das es daran liegt nur ich rendere über diese Methode
Java:
	public void render() {
		BufferStrategy bs = getBufferStrategy();
		if (bs == null) {
			createBufferStrategy(3);
			return;
		}
		Graphics g = bs.getDrawGraphics();
		g.fillRect(0, 0, getWidth(), getHeight());
		level.render(g);
		player.render(g);
		bs.show();
	}

muss ich jetzt noch ein Grafikobjekt erstellen ? Womit ich dann das BufferedImage rendere ? Oder wie weise ich meinem BufferedImage den TYPE ARGB zu ?
 

Fu3L

Top Contributor
Ist es nicht eher deine Absicht, die Buchstaben direkt mit Transparenz irgendwo drauf zu zeichnen? Dann könntest du das schon beim Laden der Bilder machen.
Allerdings verstünde ich dann nicht, was gegen direkte Nutzung von Transparenz in den Bilddateien spricht?

In meinem Spiel Delirium! (letztens vorgestellt), nutze ich keine Transparenz, sondern die Farbe 255, 0, 255, wo keine Überdeckung stattfinden soll, aber da hab ich auch das gesamte Zeichnen selbst implementiert^^
 

PixelHD

Mitglied
Ist es nicht eher deine Absicht, die Buchstaben direkt mit Transparenz irgendwo drauf zu zeichnen? Dann könntest du das schon beim Laden der Bilder machen.

Stimmt genau nur ich weiß nicht wie. Ich lade das Bild so :

Java:
BufferedImage image = ImageIO.read(Game.class.getResourceAsStream("/font.png"));

Aber wie weise ich genau dem BufferedImage ein neuen Typen zu. So wie es in deinem Beispiel ist muss ich dann noch eins erstellen und von dem neuen BufferedImage dann die Graphics nehmen und mit dem dann das image zeichnen.

Java:
Allerdings verstünde ich dann nicht, was gegen direkte Nutzung von Transparenz in den Bilddateien spricht?

Da die Zeichnungen weiß sind kann man sie sehr schwer erkennen in Paint.NET

Bin dir echt dankbar für deine ganze Hilfe :)

MFG Pixel
 

Fu3L

Top Contributor
So wie es in deinem Beispiel ist muss ich dann noch eins erstellen und von dem neuen BufferedImage dann die Graphics nehmen und mit dem dann das image zeichnen.

Das kannst du am Anfang ja schon erledigen, später belastet es den Spielfluss dann nicht mehr (bei den kleinen Bildern eh nicht).

Zu Paint.net:
Mach einfach eine schwarze Fläche, dann drücke strg+shift+n, so erhältst du eine neue transparente Ebene. Darauf malst du in weiß deinen Buchstaben. Dann löschst du einfach die schwarze untere Ebene und fertig ist dein Buchstabe. Solltest du ihn editieren müssen, fügst du einfach wieder eine schwarze Ebene ein.

Allerdings muss man dazu sagen, dass du es auch da wirst ummalen müssen in TYPE_INT_ARGB, da er sonst das BufferedImage vom Typ "Custom" nimmt und das ist ganz böse für die Performance.
Siehe hierzu: http://www.java-forum.org/spiele-multimedia-programmierung/120318-performance-bufferedimages.html
 
Zuletzt bearbeitet:
Ähnliche Java Themen
  Titel Forum Antworten Datum
B Bild wird nicht geladen Spiele- und Multimedia-Programmierung 4
D Java Bild bewegen funktioniert nicht Spiele- und Multimedia-Programmierung 8
J OpenGL Bild wird nicht richtig angezeigt Spiele- und Multimedia-Programmierung 2
S Wie kann ich ein Bild in einen Frame einfügen? Spiele- und Multimedia-Programmierung 2
U DPI von einem Bild definieren Spiele- und Multimedia-Programmierung 5
J Bild ohne Quallitätsverlust skalieren Spiele- und Multimedia-Programmierung 11
Silvascus Bild --> JFrame Hintergrund Spiele- und Multimedia-Programmierung 3
D getsubimage aus BufferedImage und Rueckwandlung in ein ImagePlus bild Spiele- und Multimedia-Programmierung 0
A Bild(sequenz) wird nicht geladen Spiele- und Multimedia-Programmierung 1
windl EXIFF Header in ein Bild schreiben Spiele- und Multimedia-Programmierung 0
L Bild in Richtung Maus drehen Spiele- und Multimedia-Programmierung 4
B Bild ohne Image auf die Festplatte streamen Spiele- und Multimedia-Programmierung 4
R [lwjgl] Cursor -> versetzt Zeichnen / Bild ist umgedreht Spiele- und Multimedia-Programmierung 2
F [JMyron] Bild von int[] zu BufferedImage Spiele- und Multimedia-Programmierung 2
Hoppelmann Alphamap (Bild) für 3D-Terrain generieren Spiele- und Multimedia-Programmierung 2
K Bild von USB-Webcam über JMF Spiele- und Multimedia-Programmierung 2
M Farbwerte für Flächen aus einem Bild erkennen Spiele- und Multimedia-Programmierung 3
S Wolken Bild/Grafik vom Programm erstellen lassen Spiele- und Multimedia-Programmierung 11
K Bild berührt Bild Spiele- und Multimedia-Programmierung 29
aze Nicht rechteckiges Bild zeichnen Spiele- und Multimedia-Programmierung 5
A Bild einer Webcam auffangen Spiele- und Multimedia-Programmierung 20
B Generierung einer Wertetabelle aus einem Bild Spiele- und Multimedia-Programmierung 3
lumo LWJGL - Bild rendern Spiele- und Multimedia-Programmierung 16
A .jpg-Bild auf andere Position verschieben Spiele- und Multimedia-Programmierung 4
F Bild im sourcecode Spiele- und Multimedia-Programmierung 32
F Bild einfärben Spiele- und Multimedia-Programmierung 5
J JOGL - Bild wird immer wieder weiß Spiele- und Multimedia-Programmierung 2
Q Rechteck in BIld suchen Spiele- und Multimedia-Programmierung 8
M Bild kopieren Spiele- und Multimedia-Programmierung 2
S Bild capturen mit direcShow Spiele- und Multimedia-Programmierung 2
B Character Bild links/rechts Spiele- und Multimedia-Programmierung 19
Developer_X Bild Größe einstellen Spiele- und Multimedia-Programmierung 2
ARadauer bild in bild suchen Spiele- und Multimedia-Programmierung 6
M 2D - Bild um y-Achse drehen Spiele- und Multimedia-Programmierung 9
S Bild spiegeln Spiele- und Multimedia-Programmierung 7
N Farberkennung und -ersetzung in einem Bild Spiele- und Multimedia-Programmierung 2
G Palette aus Bild extrahieren Spiele- und Multimedia-Programmierung 5
A Wasserzeichen auf Bild Spiele- und Multimedia-Programmierung 2
G Paintsurface ins Bild konvertieren Spiele- und Multimedia-Programmierung 8
M Sich nach links verschiebendes Bild Spiele- und Multimedia-Programmierung 2
F Bild generieren Spiele- und Multimedia-Programmierung 3
J Animation hinter transparentem Bild auf der GlassPane Spiele- und Multimedia-Programmierung 6
A Kein Bild Spiele- und Multimedia-Programmierung 3
T Bild als mehrdimesionaler Array Spiele- und Multimedia-Programmierung 4
H Bild von Webcam laden Spiele- und Multimedia-Programmierung 4
P Bild, Pixel- / Bereichsfarbe auslesen Spiele- und Multimedia-Programmierung 12
G start Bild einfrügen in ein Java Spiel Spiele- und Multimedia-Programmierung 7
Quaxli off-topic: HDR-Bild errechnen Spiele- und Multimedia-Programmierung 3
P linie in bild zeichnen Spiele- und Multimedia-Programmierung 2
G Auf Tastendruck bild verschieben Spiele- und Multimedia-Programmierung 5
O ich hab da ein problem mit nem bild Spiele- und Multimedia-Programmierung 8
C JPEG oder BMP Bild erstellen Spiele- und Multimedia-Programmierung 5
A Bild im Raum darstellen (Texture2D) Spiele- und Multimedia-Programmierung 4
V Wie berechnet man das Bild eines Schwarzen Loches in Java? Spiele- und Multimedia-Programmierung 10
K Einzelne Pixel in einem Bild lesen Spiele- und Multimedia-Programmierung 5
N Bild zu zeichnen (drawImage) klappt nur manchmal?? Spiele- und Multimedia-Programmierung 8
P repaint verschiebt das Bild Spiele- und Multimedia-Programmierung 2
S BMP-Bild Pixel für Pixel bearbeiten Spiele- und Multimedia-Programmierung 1
P 2D Bild drehen Spiele- und Multimedia-Programmierung 4
M durchsichtiges Bild nach clearRect Spiele- und Multimedia-Programmierung 8
M RGB-Bild in Graustufen-Bild umwandeln Spiele- und Multimedia-Programmierung 2
M Bild-Spiegelung mit Java! Spiele- und Multimedia-Programmierung 5
S Bild auf Bild = Nichts? Spiele- und Multimedia-Programmierung 3
S Bild in Speicherbild zeichnen = Nichts? Spiele- und Multimedia-Programmierung 3
N Bild im Panel ändern Spiele- und Multimedia-Programmierung 3
D nicht 4-eckiges bild auf Hintergrund bewegen Spiele- und Multimedia-Programmierung 2
R Bild drehen Spiele- und Multimedia-Programmierung 24
J Bild generieren Spiele- und Multimedia-Programmierung 5
X Bild auf aktueller position drehen Spiele- und Multimedia-Programmierung 2
K Java2d Bild als JPG oder so speichern Spiele- und Multimedia-Programmierung 10
A PNG pixelweise/blockweise speichern? Spiele- und Multimedia-Programmierung 2
S Pixelweise Tiles-location herausfinden? Spiele- und Multimedia-Programmierung 6
P selectedItem aus einem Methodenerstellten JPanel auslesen. Spiele- und Multimedia-Programmierung 5
windl MP3-Tags von einem Inputstream auslesen Spiele- und Multimedia-Programmierung 5
T Minecraft Bukkit Plugin Text Datei auslesen Spiele- und Multimedia-Programmierung 1
R LWJGL: OpenGL Fehler - weitere Informationen auslesen möglich? Spiele- und Multimedia-Programmierung 2
V BufferedImage[] aus anderer Classe auslesen Spiele- und Multimedia-Programmierung 2
F Plugin Spracheinstellungen und Auslesen von Strings Spiele- und Multimedia-Programmierung 7
M pixel auslesen in JOGLE Spiele- und Multimedia-Programmierung 3
gsch Videotürsprechanlage Daten auslesen Spiele- und Multimedia-Programmierung 1
P MP3 Lied länge auslesen mit JMF Spiele- und Multimedia-Programmierung 3
P Verzeichnis auslesen - Dateien werden zu oft gespeichert Spiele- und Multimedia-Programmierung 6
A Minesweeper: Koordinaten auslesen Spiele- und Multimedia-Programmierung 3
A Wie kann ich die Dateigröße aus einem tiff auslesen? Spiele- und Multimedia-Programmierung 2
T Maximalen aktuellen x,y und z- wert auslesen Spiele- und Multimedia-Programmierung 4
J Positionen von JComponents aus GUI auslesen Spiele- und Multimedia-Programmierung 6
F Position eines Objektes auslesen. Spiele- und Multimedia-Programmierung 7

Ähnliche Java Themen

Neue Themen


Oben