Durchsichtige Images werden beim kopieren schwarz

Status
Nicht offen für weitere Antworten.
B

bones

Gast
Hi, ich wandle ein Image zu einem Byte[] und verschicke das dann. Aber wenn ich Images rüber schicke die einen durchsichtigen Hintergrund haben, werden die Hintergründe Schwarz. Weiss einer wie ich das umgehen kann?
 
B

bones

Gast
Alpha???

Code:
 public static byte[] imageToByte(File inputfile)
    {
    	try
    	{
BufferedImage srcImage = ImageIO.read(inputfile);
BufferedImage outImage = null;
int height = srcImage.getHeight(), width = srcImage.getWidth();        
 if(srcImage.getHeight() > hNew || srcImage.getWidth() > wNew)
outImage = createBufferedImage(srcImage.getScaledInstance(wNew, hNew, BufferedImage.TYPE_INT_RGB));
else
outImage = srcImage;//createBufferedImage(srcImage.getScaledInstance(width, height, BufferedImage.TYPE_INT_RGB));
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
 if(inputfile.getName().toLowerCase().endsWith("gif"))	ImageIO.write((BufferedImage)outImage, "gif", byteArrayOutputStream);
if(inputfile.getName().toLowerCase().endsWith("jpg") || inputfile.getName().toLowerCase().endsWith("jpeg"))	
   ImageIO.write((BufferedImage)outImage, "jpg", byteArrayOutputStream);
if(inputfile.getName().toLowerCase().endsWith("png"))	ImageIO.write((BufferedImage)outImage, "png", byteArrayOutputStream);	
 byte[] imageData = byteArrayOutputStream.toByteArray();
byteArrayOutputStream.close();

return imageData;
 

The_S

Top Contributor
Der Alpha-Kanal eines Bildes spiegelt die Transparenz einzelner Pixel wieder.

Was mir auf den ersten Blick auffällt:

1.) Beim skalieren des Bildes gibst du als hint BufferedImage.TYPE_INT_RGB an. WENN diese Angabe korrekt WÄRE, dann müsste es TYPE_INT_ARGB heißten (für die Alpha-Unterstützung). Es ist aber nicht richtig, hier gehört hin, wie skaliert werden soll (z. B. Image.SCALE_FAST oder Image.SCALE_SMOOTH)

2.) Was macht die Methode createBufferedImage?

3.) Wie wird das byte-Array weiter verarbeitet?
 
B

bones

Gast
Hobbit_Im_Blutrausch hat gesagt.:
Der Alpha-Kanal eines Bildes spiegelt die Transparenz einzelner Pixel wieder.

Was mir auf den ersten Blick auffällt:

1.) Beim skalieren des Bildes gibst du als hint BufferedImage.TYPE_INT_RGB an. WENN diese Angabe korrekt WÄRE, dann müsste es TYPE_INT_ARGB heißten (für die Alpha-Unterstützung). Es ist aber nicht richtig, hier gehört hin, wie skaliert werden soll (z. B. Image.SCALE_FAST oder Image.SCALE_SMOOTH)

2.) Was macht die Methode createBufferedImage?

3.) Wie wird das byte-Array weiter verarbeitet?

1)Hatte mit Image.SCALE_SMOOTH probiert aber gleiches Ergebnis. Und jetzt auch mit TYPE_INT_ARGB aber das Bild das Ankommt ist schwarz.

2) Die Methode erzeugt ein BufferedImage mit der größe die ich haben will und das funktioniert auch meistens manche Bilder gehen nicht wenn zb nur die Höhe größer ist als ich in der if Bedingung verlange.

3) Ich baue mir einen HTTP-Requests und verschicke es

Code:
File theFile  = files[i];  
byte [] newb = Utils.imageToByte(theFile);
fis = new DataInputStream(new BufferedInputStream(new ByteArrayInputStream(newb)));			             		
theData = newb;
fis.readFully(theData);
fis.close();    
long bodysize = -1;

Code:
body_file1_pre.append("" 			             			
+ "--" + boundary + "\n"
+ "Content-Disposition: form-data; name=\"datafile\"; " 
+	"filename=\"" + bildfile.toString() + "\"\n"
+ "Content-Type: image/jpeg\n"
+ "\n");

Code:
cmd_post.append("" 
+ "POST " + path + "?PHPSESSID=" + sessid + " HTTP/1.0\n"
+ "Content-type: multipart/form-data, boundary=" + boundary + "\n"
+ "Content-length: " + bodysize + "\n"
+ "\n");
wr.write(cmd_post.toString());
wr.write(body_fields.toString());
wr.write(body_file1_pre.toString());
wr.flush();
raw.write(theData);
raw.flush();
 

The_S

Top Contributor
1.) Du sollst dort nicht statische Member der BufferedImage-Klasse verwenden, sondern die der Image-Klasse. Sie geben an, wie skaliert werden soll (performant, schön, ...). Wenn du einen anderen Wert angibst, dann stimmt der entweder zufällig mit einem Skalierungsverfahren überein, oder es wird das Default-Verfahren verwendet. Dort muss also aufjedenfall etwas anderes als TYPE_INT_RGB bzw. TYPE_INT_ARGB rein, da das dort sinnlos ist und nichts verloren hat. Auf die Transparenz hat dieser Parameter ebenfalls keinen Einfluss

2.) Das war mir auch klar, ich würde da nur gerne deinen Code sehen

3.) Du schickst es also an php ... kann natürlich sein, dass php die Transparenz entfernt, weil du einen Fehler in deinem php Code hast ... Da kann ich dir dann nicht weiterhelfen.
 
B

bones

Gast
Glaub nicht das es an PHP liegt weil wenn ich die Bilder so rüber schicke ohne sie von der Größe verändert zu haben dann kommen sie auch normal an. Ich poste mal die aktuelle Version von mir :

Upload.java
Code:
byte[] theData = null;	
File theFile  = files[i]; 
			             		
BufferedImage Image = ImageIO.read(theFile);
			             		
if(Image.getHeight() > Utils.hNew || Image.getWidth() > Utils.wNew)
{
	theData = Utils.imageToByte(theFile);
	fis = new DataInputStream(new BufferedInputStream(new ByteArrayInputStream(theData)));			             		
}
else
{
	fis = new DataInputStream(new BufferedInputStream(new FileInputStream(theFile)));
	theData = new byte[(int) theFile.length()];    	
}

Utils.java:
Code:
public static byte[] imageToByte(File inputfile)
    {
    	try
    	{
	        BufferedImage srcImage = ImageIO.read(inputfile);
	        BufferedImage outImage = null;
	        outImage = createBufferedImage(srcImage.getScaledInstance(wNew, hNew, BufferedImage.TYPE_INT_ARGB));


	        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
	        if(inputfile.getName().toLowerCase().endsWith("gif"))	ImageIO.write((BufferedImage)outImage, "gif", byteArrayOutputStream);
	        if(inputfile.getName().toLowerCase().endsWith("jpg") || inputfile.getName().toLowerCase().endsWith("jpeg"))	
	        														ImageIO.write((BufferedImage)outImage, "jpg", byteArrayOutputStream);
	        if(inputfile.getName().toLowerCase().endsWith("png"))	ImageIO.write((BufferedImage)outImage, "png", byteArrayOutputStream);

	        byte[] imageData = byteArrayOutputStream.toByteArray();
	        byteArrayOutputStream.close();
	        

	        return imageData;

Wenn ich in der Upload.java if(false) mache statt das von oben schickt er alle Dateien über den FileinputStream und alle Bilder kommen normal an aber es findet leider keine Anpassung der Bilder statt. Deswegen kann es nicht an PHP liegen.

und zu 2) createBufferedImage hab ich nicht geschrieben die ist schon in den Javabibliotheken drin.
 

The_S

Top Contributor
createBufferedImage ist aber kein Standard-Java - niemand kennt diese Methode. Ich vermute aber, dass in dieser Methode der Fehler liegt.
 

The_S

Top Contributor
Da steht aber nirgendwo, dass du eine statische Methode der Klasse ImageTypeSpecifier aufrufst -was ich auch irgendwie bezweifle, da du dieser Methode ein "Image" übergibst, diese Methode im ImageTypeSpecifier aber zwei Integer erwartet :roll: .
 
G

Guest

Gast
Sorry mein Fehler...

Code:
   public static BufferedImage createBufferedImage(Image image)
    {
    	BufferedImage bi = new BufferedImage(image.getWidth(null), image.getHeight(null),
        BufferedImage.TYPE_INT_RGB);    	
    	Graphics2D g = bi.createGraphics();
    	g.drawImage(image, 0, 0, null); 
    	g.dispose();
      return bi;
    }

Hatte immer woanders den Fehler gesucht, ich glaub ich brauch Urlaub :autsch:
 

The_S

Top Contributor
Wie schon gesagt, heißt TYPE_INT_RGB OHNE Alpha. Du brauchst aber MIT Alpha. Also machst du in deiner Methode aus dem BufferedImage.TYPE_INT_RGB ein BufferedImage.TYPE_INT_ARGB und schon sollte es funktionieren.
 
B

bones

Gast
Code:
  public static byte[] imageToByte(File inputfile)
    {
    	try
    	{
	        BufferedImage srcImage = ImageIO.read(inputfile);
	        BufferedImage outImage = null;
	        outImage = createBufferedImage(srcImage.getScaledInstance(wNew, hNew, BufferedImage.SCALE_SMOOTH));

	        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
	        if(inputfile.getName().toLowerCase().endsWith("gif"))	ImageIO.write((BufferedImage)outImage, "gif", byteArrayOutputStream);
	        if(inputfile.getName().toLowerCase().endsWith("jpg") || inputfile.getName().toLowerCase().endsWith("jpeg"))	
	        														ImageIO.write((BufferedImage)outImage, "jpg", byteArrayOutputStream);
	        if(inputfile.getName().toLowerCase().endsWith("png"))	ImageIO.write((BufferedImage)outImage, "png", byteArrayOutputStream);
	
	        byte[] imageData = byteArrayOutputStream.toByteArray();
	        byteArrayOutputStream.close();
	
	        return imageData; 
    	}
    	catch(Exception e)
    	{
    		e.printStackTrace();
    		return null;
    	}
    }
    
    public static BufferedImage createBufferedImage(Image image)
    {
    	BufferedImage bi = new BufferedImage(image.getWidth(null), image.getHeight(null),
        BufferedImage.TYPE_INT_ARGB);    	
    	Graphics2D g = bi.createGraphics();
    	g.drawImage(image, 0, 0, null); 
    	g.dispose();
      return bi;
    }
 

The_S

Top Contributor
Hm, schaut eigentlich gut aus. Ich ahb gerade kein Java installiert, ich teste das aber nachher mal ausführlich. Wenn sich bis dahin niemand findet, musst du dich wohl noch solang gedulden.
 

kleiner_held

Top Contributor
Bei welchem Typ von deiner Fallunterscheidung [GIF|JPG|PNG] tritt denn das Problem auf?
JPG kennt keinen Alpha-Kanal und auch GIF wird problematisch sein, da GIF keinen Alpha-Kanal kennt sondern nur eine einzige als transparent definiert Farbe. Einzig PNG sollte also klappen, es koennte aber noetig sein das ueber
diverse ImageWriteParam's noch zu konfigurieren.
 
B

bones

Gast
Hi,

es kommt bei mir einzig und allein bei GIF Bildern vor, das die "transparente" Farbe schwarz gemalt wird und so auf den Server geladen wird.
 
B

bones

Gast
Bei PNG Dateien klappt soweit alles. Nur GIF Dateien wollen nicht gehen aber alles mögliche schon probiert.

Sonst keiner eine Idee?
 
B

bones

Gast
Schon probiert die transparenten Flächen sind dann nicht mehr Schwarz sondern Beige/Grau. Eine Verbesserung aber eigentlich müsste doch noch eine Methode geben das die Farbe Transparent bleibt.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
M Durchsichtige Buttons Java Basics - Anfänger-Themen 12
R Images aus einem Array ausgeben Java Basics - Anfänger-Themen 3
DaCrazyJavaExpert Erste Schritte Images bei JAR mitexportieren Java Basics - Anfänger-Themen 58
J Wie kann ich Images per Tastendruck anzeigen/einfügen? Java Basics - Anfänger-Themen 3
Y resize von images Java Basics - Anfänger-Themen 1
Z Zwei Images auf einem JFrame - Aber nur eins wird angezeigt! Java Basics - Anfänger-Themen 5
R Images verschwinden? Java Basics - Anfänger-Themen 3
J Hoher Speicherverbrauch beim Zeichnen von Images aus einer ArrayList Java Basics - Anfänger-Themen 10
T Erste Schritte Speicher läuft voll, Diashow, Images Java Basics - Anfänger-Themen 7
Luk10 Images und Koordinaten Java Basics - Anfänger-Themen 4
E Probleme mit Images verschieben Java Basics - Anfänger-Themen 4
E java.lang.OutOfMemoryError beim Rotieren eines Images Java Basics - Anfänger-Themen 14
R Problem beim Laden eines Images Java Basics - Anfänger-Themen 7
O Images erstellen Java Basics - Anfänger-Themen 3
P Images auf JPANEL? Java Basics - Anfänger-Themen 21
M images löschen mit *.jpg ? Java Basics - Anfänger-Themen 4
I Buffered Images vergleichen Java Basics - Anfänger-Themen 3
P Images im Archiv .jar Java Basics - Anfänger-Themen 9
E Images bzw jpegs speichern Java Basics - Anfänger-Themen 5
P Transparente Images Java Basics - Anfänger-Themen 5
H Images in jar Java Basics - Anfänger-Themen 6
S ordnerinhalt lesen , images als "greifbare" elemen Java Basics - Anfänger-Themen 3
megachucky wo gibts icons, images und sound dateien zum download? Java Basics - Anfänger-Themen 2
M Bildgröße (in Byte) eines Images ermitteln Java Basics - Anfänger-Themen 2
H Hotspots in Images Java Basics - Anfänger-Themen 2
S nach Import von jars (PLC4x) in Eclipse kann nicht mehr compiliert werden Java Basics - Anfänger-Themen 9
I Zapier -> wie werden Objekte gespeichert? Java Basics - Anfänger-Themen 10
L Datum - Monat und Jahr werden falsch angezeigt Java Basics - Anfänger-Themen 4
N Ich kriege ganze zeit die Fehlermeldung "Inhalt der Zwischenablage kann nicht in die ausgewählten Elemente eingefügt werden" hat jemand eine Lösung? Java Basics - Anfänger-Themen 6
K Warum werden immer noch doppelte Zahlen ausgegeben ? Java Basics - Anfänger-Themen 13
O HashTable kann ohne Performance-Verlust in Multithreaded-Anwendungen eingesetzt werden. Java Basics - Anfänger-Themen 6
R Java kann nicht installiert werden Java Basics - Anfänger-Themen 8
P BeforeEach AfterEach werden nicht ausgeführt. Java / Selenium Java Basics - Anfänger-Themen 4
D Kleinste Zahl in Array finden die vorher noch errechnet werden müssen. Java Basics - Anfänger-Themen 4
L Gegebenes Array sortieren, indem zufällige Zahlenpaare aus Array ausgewählt werden Java Basics - Anfänger-Themen 14
I aus 2 random zahlen soll nur die ungerade summe der beiden genommen werden. Java Basics - Anfänger-Themen 13
I Greenscreen, funktioniert nicht zu 100%... nicht alle Pixel werden geändert Java Basics - Anfänger-Themen 1
R Audio kann nur zum Teil gestoppt werden Java Basics - Anfänger-Themen 1
berserkerdq2 sqllite in Java, wenn ich mache select count(*) ..., erhalte ich dann nur die gezählte Anzahl oder werden auch die Tabellen ausgegeben? Java Basics - Anfänger-Themen 2
L Hilfe! Liste mit Items werden ausgegeben aber nicht in zufälliger Reihenfolge Java Basics - Anfänger-Themen 6
H Erste Schritte Nach einer Zahl n soll n Mal der String untereinander ausgegeben werden Java Basics - Anfänger-Themen 3
sserio Wieso werden nicht alle Primzahlen bis 1000 in meine Liste gepackt ? Java Basics - Anfänger-Themen 8
docmas 2DArray Werte werden nur untereinander ausgegeben Java Basics - Anfänger-Themen 1
E Umlaute und Sonderzeichen werden nach der Build Project nicht richtig angezeigt Java Basics - Anfänger-Themen 2
M Bei nach oben scrollen soll Seite aktualisiert werden (Userscript mit Javascript) Java Basics - Anfänger-Themen 10
A Wenn eine Zahl durch 7 teilbar ist, soll statt der Zahl ein ‘*‘ angezeigt werden. java? Java Basics - Anfänger-Themen 47
C Ein Algorithmus soll schneller werden Java Basics - Anfänger-Themen 24
Q Prüfen ob Zahl als Summe von Potenzen dargestellt werden kann. Java Basics - Anfänger-Themen 20
K Erste Schritte Wie schnell ist LinkedHashMap im Vergleich zur ArrayList, wenn alle Entries durchlaufen werden? Java Basics - Anfänger-Themen 47
LiFunk Exception: es dürfen nur Nummern eingelesen werden Java Basics - Anfänger-Themen 6
U Hauptklasse kann nicht gefunden werden Java Basics - Anfänger-Themen 8
OZAN86 For Schleife von 1-50 die Zahlen werden durch ein Komma getrennt Java Basics - Anfänger-Themen 10
M Wie kann ich Werte die in einer While Schleife sind weiter genutzt werden? Java Basics - Anfänger-Themen 7
Hallolu Pong-Spiel: Schläger schneller werden lassen Java Basics - Anfänger-Themen 9
C java.sql Statement kann nicht geschlossen werden Java Basics - Anfänger-Themen 9
LetsSebi Dateien werden nicht in Zip gespeichert Java Basics - Anfänger-Themen 1
D Codeblöcke, die immer wieder im Programmverlauf benötigt werden Java Basics - Anfänger-Themen 5
J Array Elemente werden nicht gefunden! Java Basics - Anfänger-Themen 6
M Warum werden character, die Leerzeichen sind, nicht korrekt verarbeitet? Java Basics - Anfänger-Themen 2
C Array-Werte werden gemischt, ohne Logik Java Basics - Anfänger-Themen 2
P Variablen HttpResponse.getBody() wird automatisch org.json Object und kann nicht zu json.simple Object gecastet werden? Java Basics - Anfänger-Themen 7
F JMenuItem Kann nicht nach einem String benannt werden... Java Basics - Anfänger-Themen 11
L Methode implementieren, Parameter die übergeben werden sind final Java Basics - Anfänger-Themen 4
Zrebna Programm kann aus der Konsole nicht gestartet werden (in der IDE läuft es) Java Basics - Anfänger-Themen 2
D Zahlen werden falsch gekürzt :? Java Basics - Anfänger-Themen 27
T Javafx ListView kann nicht gefüllt werden. Java Basics - Anfänger-Themen 6
H Eclipse kann nicht gestartet werden .... Java Basics - Anfänger-Themen 15
R Warum werden hier nur die grün und orangen Linien ausgegeben und der Rest unten nicht? Java Basics - Anfänger-Themen 5
J Eckige Klammern werden nicht erkannt Java Basics - Anfänger-Themen 1
J Klammern werden fälschlicherweise eingelesen Java Basics - Anfänger-Themen 2
Elyt Bei Monopoly werden Felder übersprungen Java Basics - Anfänger-Themen 2
Kirby.exe Hauptklasse konnte nicht gefunden werden.... Java Basics - Anfänger-Themen 27
B Nach dem kompilieren werden Bilder nicht mehr gefunden Java Basics - Anfänger-Themen 10
L Muss eine HttpURLConnection geschlossen werden? Java Basics - Anfänger-Themen 2
B Warum werden meine System.out.println's übersprungen? Java Basics - Anfänger-Themen 9
D java main methode kann nicht kompiliert werden (Erstellen eines Objekts) Java Basics - Anfänger-Themen 6
S Vergleichen ob der Integer der benutzt eingeben werden soll überhaupt ein int ist Java Basics - Anfänger-Themen 1
B Warum können super() und this() nicht gemeinsam in einem Konstruktor verwendet werden? Java Basics - Anfänger-Themen 7
V Array, Symbol kann nicht gefunden werden Java Basics - Anfänger-Themen 2
S TableView Items werden nicht angezeigt (+Verständnisfragen) Java Basics - Anfänger-Themen 15
O Apache: Log-Settings werden nicht gezogen Java Basics - Anfänger-Themen 0
H LayoutRes, Nullable und SystemServices werden in LayoutInflater nicht importiert Java Basics - Anfänger-Themen 9
A Wie erkennt die JVM welche class verwendet werden muss? Java Basics - Anfänger-Themen 3
L Input/Output AudioInputStream kann nicht erstellt werden. Java Basics - Anfänger-Themen 3
E Die Hauptklasse konnte nicht gefunden werden. Java Basics - Anfänger-Themen 12
H Hauptklasse ... konnte nicht gefunden oder geladen werden Java Basics - Anfänger-Themen 8
I Projekt als .jar Datei speichern - Bilder werden nicht mehr angezeigt Java Basics - Anfänger-Themen 4
J Strings sind gleich werden aber ungleich ausgewertet Java Basics - Anfänger-Themen 2
A Reader wohin werden Daten gespeichert? Java Basics - Anfänger-Themen 7
S Hauptklasse konnte nicht gefunden werden Java Basics - Anfänger-Themen 0
A Aufruf von Konstruktor , obwohl 2 Parameter weggelassen werden Java Basics - Anfänger-Themen 7
A Aufruf von Konstruktor , obwohl 2 Parameter weggelassen werden Java Basics - Anfänger-Themen 0
C Matrix-Werte werden nicht wie erwartet ausgegeben Java Basics - Anfänger-Themen 7
A Harshad Zahlen sollen in einem Intervall ausgegeben werden Java Basics - Anfänger-Themen 8
M GUI Startbutton und Titel werden nicht angezeigt Java Basics - Anfänger-Themen 1
F Variablen JTextField-Inhalt kann nicht mit String abgeglichen werden Java Basics - Anfänger-Themen 2
F Interface JButtons werden nicht angezeigt... Java Basics - Anfänger-Themen 5
DaCrazyJavaExpert Bilder werden nicht angezeigt! Java Basics - Anfänger-Themen 6
DaCrazyJavaExpert JLabels werden nicht angezeigt Java Basics - Anfänger-Themen 4
G Verkettete Liste - Neu erzeugte Elemente werden nicht ausgegeben Java Basics - Anfänger-Themen 5

Ähnliche Java Themen

Neue Themen


Oben