Image zu BufferedImage konvertieren

Kampfzwereg

Bekanntes Mitglied
Hallo,

habe im Internet ein Beispiel zum Konvertieren eines Images in ein BufferedImage gefunden. Es funktioniert auch, jedoch bin ich mir nicht ganz sicher wie genau das geht.
Könnte mir einer mal kurz erklären was genau da abläuft.
Hier der Quellcode

Java:
 public BufferedImage gibAusBufferedImage()
   {
        FrameGrabbingControl fgc = (FrameGrabbingControl) player.getControl("javax.media.control.FrameGrabbingControl");
        buffer = fgc.grabFrame();
        btoi = new BufferToImage((VideoFormat) buffer.getFormat());
        img = btoi.createImage(buffer);
        Label myLabel = new Label();
        int width = img.getWidth(myLabel);
        int height = img.getHeight(myLabel);
        BufferedImage bImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
        bImage.getGraphics().drawImage(img, 0, 0, myLabel);
        return bImage;
       
   }

Außerdem ist diese Zeile
Java:
int width = img.getWidth(myLabel);
glaub ich immer null. Und ich weiß leider nicht warum -.-' .

P.S.: Die ersten paar Zeilen gehörten noch zum Catchen des Images.

Hoffe schnell Antworten zu bekommen

LG
 
Eine Zeile kann nicht "null" sein. Das Ergebnis kann ebenfalls nicht
Code:
null
sein, da es ein
Code:
int
ist. Deswegen habe ich keine Ahnung was du damit meinst.
Für deine Frage ist ja im großen und ganzen nur Zeile 10 und 11 relevant. Da wird ein BufferedImage-Objekt erstellt (einzelheiten dazu in der Api) und dein gewünschtes Bild darauf gemalt (einzelheiten dazu in der Api).
 
jedenfalls kommt da immer ne nullpointer exception in Zeile 8. Und Image.getWidth() gibt glaube ich null zurück. Also muss mit myLabel was nicht stimmen, weil getWidth() nur null zurüclgibt, wenn mit dem übergebenen Label was nicht stimmt. Abver ich weiß halt nicht was ...
 
Wenn da NPE fliegt, dann ist
Code:
img
null. Warum das so ist steht ggf in der API von JMF, womit ich selber nicht gearbeitet habe.
 
Also muss mit myLabel was nicht stimmen
Nö, daran liegt´s schonmal nicht, da kannste sicher sein, denn
Java:
Label myLabel = new Label();
sorgt dafür, dass da zumindest schonmal irgendwas drin steckt (ansonsten bekommst du auch dort eine Exception und nicht erst in Zeile 8).

Wo die NPE herkommt, musst du - wie XHelp schon sagte - mal in der API zu
Code:
createImage
nachschauen.
 
Ja, da steht AFAIR dass da halt das Video-Format nicht passt (das war kürzlich erst.... und eine Forensuche nach z.B: "BufferToImage" liefert auch einige Threads vom TO...)
 
Mal ne blöde idee, aber wieso erstellt du ein neues Label?
Wenn du das Bild einfach nur kopieren willst, versuchs doch mal mit

Java:
int width = img.getWidth(null);
int height = img.getHeight(null);
BufferedImage bImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
bImage.getGraphics().drawImage(img, 0, 0, null);

soweit ich mich richtig erinnere hats bei mir so immer funktioniert.

Lg
 
Warum denn einfach, wenn's auch umständlich geht? XD
Hatte irgend wann mal so 'nen unheimlich abgespeckten (passend für eine statische Methode) MediaTracker gebaut und der funzt auch prächtig. Vor allem dann, wenn man nicht unbedingt immer RGB- oder ARGB-Bildtypen wie z.B. GIF hat.
Java:
	public static BufferedImage waitForLoading(Image source)
	{
		if(source instanceof BufferedImage) {
			return (BufferedImage) source;
		}
		final Object[] obj = new Object[2];
		ImageConsumer ic = new ImageConsumer()
		{
			private int width, height;

			public void setProperties(Hashtable<?, ?> props)
			{
			}
			
			public void setPixels(int x, int y, int w, int h, ColorModel model,	int[] pixels, int off, int scansize)
			{
				((WritableRaster) obj[1]).setDataElements(x, y, w, h, pixels);
			}
			
			public void setPixels(int x, int y, int w, int h, ColorModel model,	byte[] pixels, int off, int scansize)
			{
				((WritableRaster) obj[1]).setDataElements(x, y, w, h, pixels);
			}
			
			public void setHints(int hintflags)
			{
			}
			
			public void setDimensions(int width, int height)
			{
				this.width = width;
				this.height = height;
			}
			
			public void setColorModel(ColorModel model)
			{
				obj[0] = model;
				obj[1] = model.createCompatibleWritableRaster(width, height);
			}
			
			public void imageComplete(int status)
			{
				synchronized(this) {
					notify();
				}
			}
		};
		source.getSource().startProduction(ic);
		synchronized(ic) {
			try {
				ic.wait();
			} catch(InterruptedException e) {
				// ignore
			}
		}
		ColorModel cm = (ColorModel) obj[0];
		WritableRaster wr = (WritableRaster) obj[1];
		return new BufferedImage(cm, wr, cm.isAlphaPremultiplied(), null);
	}
[EDIT]Im übrigen muss vor der Verwendung von "<Image>.getWidth(ImageObserver obs)" bzw. "<Image>.getHeight(ImageObserver obs)" das Image auch bereits vollständig geladen sein (evtl. per MediaTracker), sonst bekommt man dort -1 zurück und "new BufferedImage(width, height, type)" scheitert.[/EDIT]
 
Zuletzt bearbeitet von einem Moderator:

Zurück
Oben