2 Bilder übereinander legen

Status
Nicht offen für weitere Antworten.
A

AlexLg89

Gast
Hallo Leute.
Ich möchte gerne 2 Bilder (tif) aufeinander legen. Und zwar soll der Inhalt von dem einen (schwarz/weiß) auf das andere (24Bit) gelegt werden.
Ich habe es schon mit JAI versucht, aber bei mir kommt nur müll raus.
Habt ihr eine Idee, wie ich an die schwarzen Pixel komme und diese auf das andere Bild lege? Oder kann ich irgendwie die weiße Farbe im Bild auf transparent setzen?
Mfg
Alex
 

Quaxli

Top Contributor
Muß es ein TIF sein?

Die Farbe auf transparent ändern geht prinzipiell so (getestet mit JPG):

Hauptklasse mit Anzeigefunktionalität:

Code:
import java.awt.*;
import java.awt.image.*;
import java.io.IOException;
import java.io.InputStream;
import javax.imageio.ImageIO;
import javax.swing.*;

public class Test extends JPanel{
	
	private static final long	serialVersionUID	= 1L;
	BufferedImage buf;
	Image draw;
	
	public static void main(String[] args){
		new Test();
	}
	
	public Test(){
		
		InputStream img_in = this.getClass().getClassLoader().getResourceAsStream("test.jpg");
		
		try {
			buf = ImageIO.read(img_in);
		} catch (IOException e) {}
		
                //Hier findet die Umwandlung statt
		draw = createImage(new FilteredImageSource(buf.getSource(),new MyImageFilter()));
		
		JFrame frame = new JFrame("test");
		frame.setSize(600,300);
		frame.setLocation(100,100);
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		
		frame.add(this);
		
		frame.setVisible(true);
	}

	@Override
	protected void paintComponent(Graphics g) {
		super.paintComponent(g);
		g.drawImage(draw, 0, 0, this);
		g.dispose();
	}
	
}

ImageFilter:

Code:
import java.awt.Color;
import java.awt.image.RGBImageFilter;

public class MyImageFilter extends RGBImageFilter{

	public int filterRGB(int x, int y, int rgb) {

		Color in = new Color(rgb);
		
		if(rgb == Color.black.getRGB()){
			in = new Color(in.getRed(),in.getGreen(),in.getBlue(),0);
		}

		return in.getRGB();
	}

}

Die Änderung in MyImageFilter geht im Prinzip auch mit Bitverschiebung, wenn Dir das lieber ist. Das oben ist der (für mich) bequemere Weg.
 
A

AlexLg89

Gast
Bin ich einfach zu dumm, oder stimmt da etwas nicht? ^^

Code:
Exception in thread "main" java.lang.IllegalArgumentException: input == null!
	at javax.imageio.ImageIO.read(Unknown Source)
	at imgTest.Test.<init>(Test.java:26)
	at imgTest.Test.main(Test.java:18)

Ich habe die Bilddatei im selben Package wie die Klasse. Oder habe ich da was falsch verstanden?
 

Quaxli

Top Contributor
Mit ImageIO kannst Du keine TIFF einlesen. Wenn Du ein bißche googelst findest Du hauptsächlich Verweise auf JAI.
Wenn Du ein TIFF mit JAI einlesen kannst, solltest Du den Code oben verwenden können.
 
G

Guest

Gast
Wenn ich das Bild mit JAI einlese, dann habe ich z.B. ne RenderedOp. Ich weis aber nicht, wie ich das dann mit dem Programm oben verknüpfen kann.

Code:
public RenderedImage readImage(String filename){
      
      FileSeekableStream image = null;
      try {
          image = new FileSeekableStream(filename);
      } catch (IOException e) {
          e.printStackTrace();
          System.exit(0);
      }

      ParameterBlock pb = new ParameterBlock();
      pb.add(image);

      RenderedImage imageFromFile = (RenderedImage)JAI.create("tiff", pb);
      
      return imageFromFile ;
}
 

Quaxli

Top Contributor
Hast Du mal probiert, das RenderedImage in ein BufferedImage zu casten und dann in obigem Beispiel zu verwenden?
 
A

AlexLg89

Gast
Leider will das nicht klappen.

Code:
Exception in thread "main" java.lang.ClassCastException: javax.media.jai.RenderedOp cannot be cast to java.awt.image.BufferedImage
	at imgTest.Test.<init>(Test.java:33)
	at imgTest.Test.main(Test.java:27)

Der Aufruf:

Code:
BufferedImage img_in = (BufferedImage)readImage("C:/Temp/savedImage.tif");
      
draw = createImage(new FilteredImageSource(img_in.getSource(),new MyImageFilter()));


Die Funktion:

Code:
public RenderedImage readImage(String filename){
      
      FileSeekableStream image = null;
      try {
          image = new FileSeekableStream(filename);
      } catch (IOException e) {
          e.printStackTrace();
          System.exit(0);
      }

      ParameterBlock pb = new ParameterBlock();
      pb.add(image);

      RenderedImage imageFromFile = JAI.create("tiff", pb);
      
      return imageFromFile;
   }
 

Quaxli

Top Contributor
Ich hab' mal ein bißchen dran rumgefrickelt und bei mir funzt es jetzt. Das war aber mein erster Versuch mit JAI, evtl. gibt's noch bessere Herangehensweisen:

Code:
import java.awt.*;
import java.awt.image.*;
import java.awt.image.renderable.ParameterBlock;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.net.URL;
import javax.media.jai.JAI;
import javax.media.jai.RenderedOp;
import javax.swing.*;

import com.sun.media.jai.codec.FileSeekableStream;

public class Test extends JPanel {

	private static final long	serialVersionUID	= 1L;
	BufferedImage							buf;
	Image											draw;

	public static void main(String[] args) {
		new Test();
	}

	public Test() {
		
		URL img_in = this.getClass().getClassLoader().getResource("test.tif");
		buf = readImage(img_in.getFile());

		draw = createImage(new FilteredImageSource(buf.getSource(),	new MyImageFilter()));

		JFrame frame = new JFrame("test");
		frame.setSize(600, 300);
		frame.setLocation(100, 100);
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

		frame.add(this);

		frame.setVisible(true);
	}

	@Override
	protected void paintComponent(Graphics g) {
		super.paintComponent(g);
		g.drawImage(draw, 0, 0, this);
		g.dispose();
	}

	public BufferedImage readImage(String filename) {

		FileSeekableStream image = null;
		try {
			RandomAccessFile raf = new RandomAccessFile(filename,"r");
			System.out.println(raf);
			
			image = new FileSeekableStream(raf);
			
		} catch (FileNotFoundException e1) {
			e1.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}

		ParameterBlock pb = new ParameterBlock();
		pb.add(image);

		RenderedOp ro = JAI.create("tiff", pb, null);

		return ro.getAsBufferedImage();
	}

}
 
G

Guest

Gast
Vielen, vielen Dank erstmal.
Hast mir sehr geholfen :)
Falls sich noch ein Problem auftut, werd ich nochmal hier posten ;)
 
A

AlexLg89

Gast
Jetzt muss ich irgendwie noch das draw in einen RenderedOp kriegen.
Könntest du mir da nochmal helfen?
 

Quaxli

Top Contributor
Warum? Er zeichnet das doch jetzt wie gewünscht. Wozu noch ein RenderedOp? (Ich bin JAI-Anfänger..)
 
G

Guest

Gast
Selbstverständlich zeichnet er das richtig.
Aber ich muss das Bild mit der Transparenz auf ein Bild ohne Transparenz legen. Das mache ich mit Jai. In der Methode benutze ich 2 RenderedOps. Mit einem RenderedOp und einem Image hat es leider nicht geklappt. Das ist eben mein Problem.
 

Quaxli

Top Contributor
Die Methode readImage hat ja auch ein RenderedOp im Bauch. Kannst Du nicht dieses verwenden bzw. zurück geben?
 
A

Alexlg89

Gast
Leider bringt mir das nicht. Ich müsste den Filter irgendwie auf das RenderedOp anwenden, aber das habe ich nicht hinbekommen. Ich habe noch keine Möglichkeit gefunden, wie ich mit JAI Filter benutzen kann. Jemand ne Idee?
 
A

Alexlg89

Gast
Ich habs hinbekommen ;)

public static RenderedOp minImages(RenderedOp image, RenderedOp background){
ParameterBlock pb = new ParameterBlock();
pb.addSource(image);
pb.addSource(background);
return JAI.create("min", pb);
}
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
M Bilder werden unscharf angezeigt Spiele- und Multimedia-Programmierung 5
S Bilder Für Schachfiguren Spiele- und Multimedia-Programmierung 14
beatles Minesweeper - keine Bilder Spiele- und Multimedia-Programmierung 3
P [Spiel]Welche Bilder sind gleich Spiele- und Multimedia-Programmierung 2
O Bilder senden TV über DLNA? Spiele- und Multimedia-Programmierung 0
T Bilder Elegant darstellen... Spiele- und Multimedia-Programmierung 7
T Bilder einbinden, bzw. ändern Spiele- und Multimedia-Programmierung 5
M Bilder effizient speichern/serialisieren Spiele- und Multimedia-Programmierung 10
M Bilder in Java Spiele- und Multimedia-Programmierung 7
D Slick Lib - Bilder einlesen funktioniert nicht Spiele- und Multimedia-Programmierung 2
B Bilder in GUI ändern ohne repaint() Spiele- und Multimedia-Programmierung 6
T Spielautomat bilder vergleichen Spiele- und Multimedia-Programmierung 34
A Bilder werden nicht geladen Spiele- und Multimedia-Programmierung 6
S Datenbank gesucht für Bilder(gif-dateien) Spiele- und Multimedia-Programmierung 5
A Bilder (auf JPanels) auf komplette Zellengröße (GridBagLayout) skalieren Spiele- und Multimedia-Programmierung 2
I Bilder aus Quaxli's Tutorial Spiele- und Multimedia-Programmierung 3
A bilder performant und unhässlich skalliert darstellen? Spiele- und Multimedia-Programmierung 10
J 2D-Bilder in Java3D Spiele- und Multimedia-Programmierung 4
A Bilder(BMP) speichern Spiele- und Multimedia-Programmierung 2
S Bilder zuscheiden - Werte von php übergeben Spiele- und Multimedia-Programmierung 7
D Bilder besser interpolieren Spiele- und Multimedia-Programmierung 4
F Dynamische Bilder erzeugen? Spiele- und Multimedia-Programmierung 7
R Bilder aus animierter .gif extrahieren? Spiele- und Multimedia-Programmierung 4
C jpg.Bilder teilen/bearbeiten für Puzzle Spiele- und Multimedia-Programmierung 7
A Bilder bewegen Spiele- und Multimedia-Programmierung 2
M Bilder verzerren [Rechteck -> Trapez] Spiele- und Multimedia-Programmierung 4
K Bilder drehen Spiele- und Multimedia-Programmierung 5
H Bilder speichern 2 - Methode richten? Spiele- und Multimedia-Programmierung 2
H Bilder speichern Spiele- und Multimedia-Programmierung 3
A Bilder flackern Spiele- und Multimedia-Programmierung 5
T Gekachelte Bilder darstellen Spiele- und Multimedia-Programmierung 2
J Objekte übereinander lagern Spiele- und Multimedia-Programmierung 1
0 Boxen übereinander stapelt Problem Spiele- und Multimedia-Programmierung 5
K mit Canvas übereinander zeichnen Spiele- und Multimedia-Programmierung 4
W Graphik über den Bildschirm legen (Windows) Spiele- und Multimedia-Programmierung 9
J CubeMap auf glutSolidSpheere legen Spiele- und Multimedia-Programmierung 5

Ähnliche Java Themen

Neue Themen


Oben