ubuntuusers.de

[Java] BufferedImage mit Hintergrundfarbe?

Status: Ungelöst | Ubuntu-Version: Nicht spezifiziert
Antworten |

dersven

Anmeldungsdatum:
16. August 2005

Beiträge: 792

Wohnort: Kreuzlingen, Schweiz

Hallo.

In meinem Programm kann ein Bild erstellt und als PNG gespeichert werden. Dafür erstelle ich für jeden Pixel einen Farbwert, und setze den Pixel dann an eine entsprechende Stelle des Bildes (BufferedImage). An einer Stelle setzt sich der Punkt z.B. aus 20% blau (0,0,255), 10% grün (0,255,0) zusammen, der Rest ist HintergrundFarbe (hier: weiss).

Wenn jetzt jemand die fertige PNG-Datei nur auf einem schwarzen Hintergrund anschauen möchte (z.B. in einer Präsentation) kann es manchmal weisse Ränder geben, da z.B. 99% durch die HintergrundFarbe (weiss) bestimmt wird. Nun hat mir jemand gesagt, dass man eine HintergrundFarbe festlegen kann, die dann in GrafikProgrammen für das fertige Bild geändert werden kann. Ich mische also nicht mehr die Farbe aus farbe1, farbe2 und Hintergrund zusammen, sondern sage nur noch wieviel farbe1 und farbe2 ich habe, und welche Hintergrundfarbe standardmäßig verwendet werden soll (hier: weiss). Wenn der Nutzer das fertige (z.B. als PNG gespeichertes) Bild für einen schwarzen Hintergrund haben möchte, kann er einfach im Grafik-Programm seiner Wahl sagen, dass der Hintergrund schwarz werden soll. Die Farbwerte bei jedem Pixel werden dann neu berechnet (z.B. us 20% blau (0,0,255), 10% grün (0,255,0) und der rest schwarz).

  • Kann ich das in Java realisieren?

  • Nach welchen Schlagworten muss ich suchen?

  • Welche GrafikFormate unterstützen das?

  • Kann ich auch mehr als nur die Hintergrundfarbe abgeben?

  • Ist es auch möglich Transparenz festzulegen?

Grüße und Danke für die Hilfe

Vain

Avatar von Vain

Anmeldungsdatum:
12. April 2008

Beiträge: 2505

Das könntest du wohl über Transparenz und den Alpha-Kanal erreichen, vermutlich meinte das dein Kumpel auch. Neben Rot, Grün und Blau gibt es dann noch „Alpha“, also 32 Bit pro Pixel und nicht nur 24. Im einfachsten Fall setzt du dann statt „Pixel = (0, 0, 0)“ einfach „Pixel = (0, 0, 0, 0)“, dann ist der Pixel durchsichtig und du kannst dir hinterher überlegen, ob und wie der Hintergrund mit einer konkreten Farbe gefüllt wird. PNG zum Beispiel unterstützt das, JPEG aber nicht.

Java kann in der Regel auch mit sowas umgehen. Wie das jetzt konkret beim BufferedImage aussieht, kann ich dir aus dem Kopf nicht sagen, aber ein großes Problem sollte das nicht sein.

Vain

Avatar von Vain

Anmeldungsdatum:
12. April 2008

Beiträge: 2505

Da nun doch schon etwas Zeit vergangen ist, erlaube ich mir mal einen berühmt-berüchtigten Doppelpost. 😉

Hier mal ein kleines Beispiel. Es werden zwei Quadrate gezeichnet, ein komplett rotes und etwas verschoben darunter ein grünes, das nur „halb sichtbar“ ist (durch den Alpha-Wert auf 128). Der Hintergrund ist die ganze Zeit komplett transparent. Wie du siehst, ist der Bildtyp am Anfang der Knackpunkt.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
import java.awt.image.BufferedImage;
import java.awt.Graphics2D;
import java.awt.Color;
import javax.imageio.ImageIO;
import java.io.File;

public class Alpha
{
	public static void main(String[] args)
	{
		BufferedImage buf = new BufferedImage(640, 480,
				BufferedImage.TYPE_INT_ARGB);
		Graphics2D g2 = buf.createGraphics();

		// Achtung, Farbe wird hier als RGBA angegeben und nicht wie im
		// Typ oben ARGB.
		g2.setPaint(new Color(255, 0, 0, 255));
		g2.fillRect(100, 100, 100, 100);

		g2.setPaint(new Color(0, 255, 0, 128));
		g2.fillRect(150, 150, 100, 100);

		try
		{
			ImageIO.write(buf, "PNG", new File("test.png"));
		}
		catch (java.io.IOException e)
		{
			e.printStackTrace();
		}
	}
}

Ich würde eigentlich davon ausgehen, dass du das auch so später in Folien oder ähnlichem weiterverwenden kannst. Der jeweilige Hintergrund scheint ja durch. Solltest du dennoch Bilder mit einer bestimmten Hintergrundfarbe erzeugen wollen (zum Beispiel, weil es JPEGs sein müssen), dann könntest du das hiermit erledigen:

1
2
3
4
5
#!/bin/bash
for bg in white black "#FEFE08"
do
	convert test.png -background "$bg" -flatten test_"$bg".png
done

Das erzeugt dir drei Bilder mit weißem, schwarzem Hintergrund und einmal #FEFE08. Als Ausgabeformat ginge hier natürlich auch etwas anderes als PNG.

Antworten |