Durchschnittliche Farbe eines Bildes

Status
Nicht offen für weitere Antworten.

Granjow

Mitglied
Hallo zusammen,

Ich habe vor, ein Programm zu schreiben, welches eine Bilddatei einliest. Raus soll dann ein neues Bild (beliebiger Grösse) kommen, einfarbig. Die Farbe soll der Durchschnittswert des Bildes sein, also Summe der R-Werte aller Pixel geteilt durch Anzahl Pixel, Summe der G-Werte durch Anz. Pixel und die der B-Werte.

Ist das aufwändig zu programmieren? Für welche Dateien lässt es sich mit vertretbarem Aufwand realisieren – auch für jpg-Dateien?

Ich will evtl. damit meine Bilder in Bildergalerien ordnen. Darum kommt später eventuell sogar eine Sortierung von Bildern in Frage.

Granjow
 

0xdeadbeef

Top Contributor
Sollte keine große Sache sein. Obwohl sich mir der Sinn dieser "einfarbigen" JPEGs jetzt gerade irgendwie verschließt. Wozu ein Bild abspeichern, bei dem alle Pixel die gleiche Farbe haben? Oder habe ich da was nicht kapiert?
 

lin

Top Contributor
naja, ich denke er will seine Bilder ganz einfach nach Helligkeit ordnen, oder?
 

Granjow

Mitglied
Genau. Und verschiedene Grössen, damit man auch was von der Farbe sieht, wenn du nur ein 1 Pixel grosses Bild hast, kannst du nur raten oder vergrössern, um die Farbe zu erkennen.

Womit würde man denn die Bilder einlesen und schreiben? Steht das in der Java-Insel?

Granjow
 

The_S

Top Contributor
steht bestimmt in der Java-Insel ;) .

Ansonsten ImageIO.write bzw. ImageIO.read . Die Pixel bekommst du mit bufferedimage.getRGB
 

Granjow

Mitglied
Ich bin zu blöd dafür. Warum geht bei mir Image.getWidth() nicht, warum will er dort einen ImageObserver? Und überhaupt, wie bekomme ich von einem Image ein BufferedImage?

Granjow

edit: Ja, zu blöd ... hier
 

Granjow

Mitglied
Momentan sieht es so aus:

Code:
import java.awt.Color;
import java.awt.Image;
import java.awt.image.ImageObserver;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;

public class GetImageValue {
	static String[] extensions = {".jpg", ".jpeg", ".png", ".bmp" };

	public static void main(String[] args) throws IOException {
		BufferedImage bimg = ImageIO.read(IOUtils.openInFileDialog(extensions, false));
		Color color;

		int w = bimg.getWidth(),
			h = bimg.getHeight();
		
		int xR,
			xG,
			xB,
			R = 0,
			G = 0,
			B = 0;
		for (int y = 0; y < h; y++) {
			xR = 0;
			xG = 0;
			xB = 0;
			for (int x = 0; x < w; x++) {
				color = new Color(bimg.getRGB(0,0));
				xR += color.getRed();
				xG += color.getGreen();
				xB += color.getBlue();
			}
			R += (xR / w);
			G += (xG / w);
			B += (xB / w);
		}
		R = R / h;
		G = G / h;
		B = B / h;
		
		System.out.println(R + "/" + G + "/" + B);
	}

}

Jetzt fehlt mir noch etwas schnelles, um ein neues Bild zu erzeugen und mit der berechneten Farbe zu füllen. Wie macht man das? Über das g2d?

Granjow
 

lin

Top Contributor
BufferedImage erzeugen
Code:
BufferedImage bimage = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);

Code:
Graphics2D g2d = bimage.createGraphics();
g2d.setColor(new Color(x, y, z));
g2d.fill(new Rectangle2D.Double(0, 0, width, height));
g2d.dispose();
 

The_S

Top Contributor
Mit ImageIO.read(file) haste automatisch nen BufferedImage und da kannste auch ohne ImageObserver getWidth ausführen ;). Ansosnten einfach this mitübergeben.
 

thE_29

Top Contributor
Ich würds so machen

Code:
  public void average_color_picture(String old_file, String new_file) throws Exception
  {
    BufferedImage img = ImageIO.read(new File(old_file));
    Raster raster = img.getRaster();
    int height = img.getHeight();
    int width = img.getWidth();
    double ar[] = new double[4];    
    double r = 0, g = 0, b = 0,a = 0;
    for(int x = 0; x != width; x++)
    {
      for(int y = 0; y != height; y++)
      {
        raster.getPixel(x,y,ar);
        r += ar[0];
        g += ar[1];
        b += ar[2];
        a += ar[3];
      }
    }
    double all = height * width;
    r /= all;
    g /= all;
    b /= all;
    a /= all;
    ar[0] = r;
    ar[1] = g;
    ar[2] = b;
    ar[3] = a;
    WritableRaster writer = img.getRaster();
    for(int x = 0; x != width; x++)
    {
      for(int y = 0; y != height; y++)
      {
        writer.setPixel(x,y,ar);
      }
    }
    ImageIO.write(img,"png",new File(new_file));
  }

Für was gibts diese ganzen Pixel set/get Methoden wennst mit paint rumpfuscht :bae:
 

Granjow

Mitglied
Code:
import java.awt.image.BufferedImage;
import java.awt.image.Raster;
import java.awt.image.WritableRaster;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;

public class GetImageValue {
	static String[] extensions = { ".bmp", ".png", ".jpeg", ".jpg" };

	public static void main(String[] args) {
		Timer timer = new Timer();
		File f = null;
		BufferedImage bimg = null;
		Raster raster = null;

		try {
			f = IOUtils.openInFileDialog(extensions, false);
			bimg = ImageIO.read(f);
		} catch (IOException e) {
			e.printStackTrace();
			System.exit(1);
		}

		timer.start();

		raster = bimg.getRaster();
		int w = bimg.getWidth(), h = bimg.getHeight(), p = w * h;
		double R = 0, G = 0, B = 0, A = 0;
		double[] rgba = new double[4];

		R = 0;
		G = 0;
		B = 0;
		A = 0;

		for (int x = 0; x < w; x++) {
			for (int y = 0; y < h; y++) {
				raster.getPixel(x, y, rgba);
				R += rgba[0];
				G += rgba[1];
				B += rgba[2];
				A += rgba[3];
			}
		}

		System.out.println("Calc: " + Mathe.formatTime(timer.reset(), true));

		R /= p;
		G /= p;
		B /= p;
		A /= p;

		System.out.println(R + "/" + G + "/" + B + "/" + A);

		writeImage(f, bimg, "_value2.png", (int) R, (int) G, (int) B, (int) A);
		System.out.println("Write: " + Mathe.formatTime(timer.reset(), true));

	}

	public static void writeImage(File f, BufferedImage bimg, String newExt,
			int R, int G, int B, int A) {
		int w = bimg.getWidth();
		int h = bimg.getHeight();
		WritableRaster writer = bimg.getRaster();

		for (int x = 0; x < w; x++) {
			for (int y = 0; y < h; y++) {
				writer.setPixel(x, y, new int[] { (int) R, (int) G, (int) B,
						(int) A });
			}
		}
		try {
			ImageIO.write(bimg, "png", IOUtils.addFileExtension(IOUtils
					.removeFileExtension(f), newExt));
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

}

Ende, funktioniert. Leider nicht so schnell wie erwartet:

Calc: 641 ms
113.24467086791992/110.10273170471191/50.895527839660645/0.0
Write: 1 s 125 ms

Und kann man das Ausgabebild auf diese Art auch auf eine sinnvolle Grösse reduzieren?

tnx, Granjow

edit: Die anderen Quellen kann ich auch posten, wenns jemanden interessiert ;)
 

The_S

Top Contributor
Fürs skallieren bitte das nächste mal die Forensuche verwenden, wurde schon ziemlich oft verwendet :roll:

Zauberwort hierfür lautet Image#getScaledInstance ich würds aber skallieren bevor dus bearbeitest, dann geht das bearbeiten auch schneller ;)
 

lin

Top Contributor
Das Ausgabebild? Da kannste ja einfach die Werte von w und h verändern, also z.B.
Code:
 int w = (int) (0.5 * bimg.getWidth());
 

Granjow

Mitglied
Aber dann wird es doch trotzdem gleich gross, einfach ist nur das obere linke Viertel farbig?

Manchmal sollte ich vielleicht etwas mehr schlafen.

Code:
public static void writeImage(File f, String newExt,
			int R, int G, int B, int A) {
		int w = 50;
		int h = 50;
		BufferedImage bimg2 = new BufferedImage(w, h, BufferedImage.TYPE_INT_ARGB);
		WritableRaster writer = bimg2.getRaster();

		if (A == 0) A = 255;
		for (int x = 0; x < w; x++) {
			for (int y = 0; y < h; y++) {
				writer.setPixel(x, y, new int[] { (int) R, (int) G, (int) B,
						(int) A });
			}
		}
		try {
			ImageIO.write(bimg2, "png", IOUtils.addFileExtension(IOUtils
					.removeFileExtension(f), newExt));
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
 

lin

Top Contributor
hm, der link funzt bei mir nicht oder er ist tödlich langsam..

Aber wahrscheinlich sammelst du irgendwelche Bilder im Memory an.
 

Granjow

Mitglied
@lin: War der Fall.
Neue Version
(Mit Quellcode)

Code:
for (int i = 0; i < f.length; i++) {
				System.out.println(f[i].getAbsolutePath());
				bimg[i] = ImageIO.read(f[i]);

				//[...]

				bimg[i] = null;
			}

Die letzte Zeile war die Rettung.

Granjow
 

thE_29

Top Contributor
Da stellt sich die Frage, warum du das in einem Array abspeicherst, wenn du es in der for schleife wieder auf null setzt :bae:

Kannst gleich 1 Objekt nehmen ^^
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
T Methoden Farbe auf Screenshot suchen Allgemeine Java-Themen 2
Q Eclipse Escape Sequenzen Farbe ändern Allgemeine Java-Themen 4
Drachenbauer Wie kann eine vorgegebene Farbe über einen String erkannt werden? Allgemeine Java-Themen 11
J Farbe von Buttons mehrmals ändern Allgemeine Java-Themen 5
R Farbe zu einem Eckpunkt generieren Allgemeine Java-Themen 0
B ImageView Farbe ändern Allgemeine Java-Themen 3
J Bilder halb in falscher Farbe nach kopieren aus Web Allgemeine Java-Themen 3
M Temperaturverlauf in Farbe darstellen Allgemeine Java-Themen 8
K Farbe erkannt = agieren, per Mausklick etc. Allgemeine Java-Themen 47
H Apache POI HSSF - Farbe/Rahmen etc. ohne Style-Vorlage? Allgemeine Java-Themen 4
E int Farbe Allgemeine Java-Themen 14
R Komponente hat nicht die gesetzten Eingeschaften (Text, Farbe) Allgemeine Java-Themen 3
M Farbe transparent machen Allgemeine Java-Themen 3
M JXHyperlink Farbe Allgemeine Java-Themen 2
S Class RGB Farbe Allgemeine Java-Themen 2
V Pixel-Farbe Allgemeine Java-Themen 10
Z Farbe des Pixels rechts unten in einem BufferedImage? Allgemeine Java-Themen 4
R Farbe im Bild ersetzen Allgemeine Java-Themen 11
P DockingFrame Farbe der Tabs verändern Allgemeine Java-Themen 4
P JTree Farbe Allgemeine Java-Themen 14
M Swing JButton Farbe zurücksetzen Allgemeine Java-Themen 6
W Im Chat die farbe ändern Allgemeine Java-Themen 7
A System.out.println mit Farbe Allgemeine Java-Themen 6
S Farbe? (hexadezimal) Allgemeine Java-Themen 2
S Farbe erkennen! Allgemeine Java-Themen 3
R Umwandlung Farbe in Schwarz/Weiss Allgemeine Java-Themen 2
clemson Farbe in Datei speichern & laden Allgemeine Java-Themen 3
N Farbe ändern bei System.out.println Allgemeine Java-Themen 2
O regulärer Ausdruck zum durchsuchen eines Strings verwenden Allgemeine Java-Themen 2
T Rotationswinkel eines Bildes bestimmen Allgemeine Java-Themen 4
C Probleme beim Erstellen eines runnable-jar files Allgemeine Java-Themen 1
J JavaScript innerhalb eines Java Projekts ausführen Allgemeine Java-Themen 2
Encera Größe eines Objektes in Byte berechnen Allgemeine Java-Themen 2
8u3631984 Prüfen ob min. ein Element eines Sets in einem anderen Set enh Allgemeine Java-Themen 4
M Array Rang eines Elements Allgemeine Java-Themen 4
OnDemand Teile eines Links entfernen Allgemeine Java-Themen 6
H Auslesen eines (LDAP-)Attributs in Active Directory Allgemeine Java-Themen 2
W JSON parsen eines ,mit JS.stringify erstellten Strings Allgemeine Java-Themen 27
H Textposition eines gedrehten Textes verschieben Allgemeine Java-Themen 8
berserkerdq2 run-methode eines Threads so programmieren, dass 30x die Sekunde etwas ausgeführt wird. Allgemeine Java-Themen 44
E Ersetzen eines Bildes in der Kopfzeile eines Word-Docx-Dokuments mit Apache POI XWPF Allgemeine Java-Themen 0
N Fahrtrichtung eines selbstfahrenden Auto ändern Allgemeine Java-Themen 3
T Letztes Zeichen eines Strings enfernen Allgemeine Java-Themen 14
S Übergabe eines Sortierkriteriums für ein Artikel Array mittels BiPredicate<Artikel, Artikel> Allgemeine Java-Themen 13
gotzi242 Schatzsuche mithilfe eines O(log n) Algorithmus Allgemeine Java-Themen 2
C Koordinaten LONG/LAT eines neuen Punktes in bestimmter Entfernen und Winkel berechnen Allgemeine Java-Themen 3
Tobero Meine Funktion für das beinhalten eines Punktes in einem Kreis funktioniert nicht Allgemeine Java-Themen 5
LimDul Direktes return eines Array geht nicht Allgemeine Java-Themen 20
S Mittelwert anhand eines Stream berechnen Allgemeine Java-Themen 5
kodela Breite eines erweiterten Monitors feststellen Allgemeine Java-Themen 5
R Zeilen eines 2d Arrays abwechselnd links und rechts mit Nullen auffüllen Allgemeine Java-Themen 14
Zrebna Alternative Darstellung eines Codesnippets Allgemeine Java-Themen 33
kodela Inhalt eines Arrays ändert sich mysteriös Allgemeine Java-Themen 2
bueseb84 Wget mit Wildcards - oder wie lädt man bei JFrog die letzte Version eines Artifacts herunter Allgemeine Java-Themen 3
N Erkennen eines Programs Allgemeine Java-Themen 2
N Pausieren eines Programmes Allgemeine Java-Themen 4
D Input/Output Implementierung eines CommandHandlers/Parsers für viele Eingaben Allgemeine Java-Themen 26
M Gibt es eine API die den aktuellen Wert eines Indikators beim Trading zurückgibt? Allgemeine Java-Themen 7
F Wie bekommt man alle Filenamen eines Webserver Verzeichnisses Allgemeine Java-Themen 6
A Fehler beim Öffnen eines Projekts Allgemeine Java-Themen 6
N Eigenschaften eines Buttons per Setter verändern Allgemeine Java-Themen 5
S Ausfuehrung eines Programms aufzeichnen..? Allgemeine Java-Themen 4
X Ermittlung eines doppelte Paars mit Streams Allgemeine Java-Themen 50
Stonie Prüfen von direkter Implementierung eines Interfaces Allgemeine Java-Themen 7
S Vorbereitung eines Praktikums Allgemeine Java-Themen 4
H Aufruf eines Web Service anhand übergebenen Parameter Allgemeine Java-Themen 2
M Weiterleiten von empfangenen Nachrichten eines StompSessionHandlers Allgemeine Java-Themen 1
J Programm zum Suchen eines Wortes im Dateisystem Allgemeine Java-Themen 4
H Rename eines Projekts Allgemeine Java-Themen 1
J Fenstergröße eines anderen Programmes auslesen Allgemeine Java-Themen 9
ReinerCoder auf Klassen innerhalb eines package zugreifen Allgemeine Java-Themen 22
Meeresgott Erste Schritte Sourcetree - Git | Suchen eines Commits Allgemeine Java-Themen 2
E Status eines USB Mikrofon abfragen Allgemeine Java-Themen 2
DaCrazyJavaExpert OOP Ansätze und Tipps zum Porgrammieren eines Taschenrechners Allgemeine Java-Themen 25
A OOP Problem beim Berechnen der größten Fläche eines Ringes Allgemeine Java-Themen 19
JavaNewbie2.0 Start eines Anderen Programm erkennen Allgemeine Java-Themen 6
I Verbindung eines Java-Plugins mit Webserver Allgemeine Java-Themen 3
L Auswertung eines Testes funktioniert nicht Allgemeine Java-Themen 37
G Iteratoren - Wie kann man mithilfe von Iteratoren nur jeden zweiten Wert eines TreeSets ausgeben? Allgemeine Java-Themen 4
GreenTeaYT Elemente eines 2Dim LinkedList von links nach rechts ausgeben? Allgemeine Java-Themen 0
B Spalten eines 2d-Arrays Allgemeine Java-Themen 2
M Rechenprogramm eines wissenschaftlichen Taschenrechners Allgemeine Java-Themen 4
S Eigenschaften (hier Verknüpfung) eines Files lesen Allgemeine Java-Themen 2
E Typüberprüfung eines chars Allgemeine Java-Themen 5
H Hilfe bei Erstellung eines Hilfe Fenster bei Tastendruck (F1 bei Win98) Allgemeine Java-Themen 5
T Teile eines Double-Wertes verändern Allgemeine Java-Themen 2
R Rückgabe eines Arrays durch Funktion Allgemeine Java-Themen 9
H Datentypen Typ eines Arrays überprüfen Allgemeine Java-Themen 9
RalleYTN DPI eines Bildes ändern Allgemeine Java-Themen 4
N Methoden Methoden einer Klasse auf Grundlage eines Strings aufrufen Allgemeine Java-Themen 6
K Bestimmten Bereich eines Strings lesen Allgemeine Java-Themen 6
C -Verschiedene Versionen eines Programms verwalten Allgemeine Java-Themen 7
O Datentypen Erstellung eines Containers, der verschachtelte Map-Strukturen beherbergen kann Allgemeine Java-Themen 0
A einmalige Ausführung eines Methodenabschnittes Allgemeine Java-Themen 3
F CPU Last eines Thread ausfindig machen Allgemeine Java-Themen 0
L Menge der Buchstaben eines Textes zählen Allgemeine Java-Themen 3
F Teil eines Bildes laden Allgemeine Java-Themen 1
Neumi5694 Operatoren regEx für das Erstellen eines Strings verwenden Allgemeine Java-Themen 3
P Löschen eines keys in einer SortedMap Allgemeine Java-Themen 5
RalleYTN Input/Output URL eines Zip Entry? Allgemeine Java-Themen 2

Ähnliche Java Themen

Neue Themen


Oben