# Image zu BufferedImage konvertieren



## Kampfzwereg (4. Jun 2012)

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


```
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 

```
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


----------



## XHelp (4. Jun 2012)

Eine Zeile kann nicht "null" sein. Das Ergebnis kann ebenfalls nicht 
	
	
	
	





```
null
```
 sein, da es ein 
	
	
	
	





```
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).


----------



## Kampfzwereg (4. Jun 2012)

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 ...


----------



## XHelp (4. Jun 2012)

Wenn da NPE fliegt, dann ist 
	
	
	
	





```
img
```
 null. Warum das so ist steht ggf in der API von JMF, womit ich selber nicht gearbeitet habe.


----------



## Kampfzwereg (4. Jun 2012)

NPE?


----------



## Marco13 (4. Jun 2012)

Null
Pointer
Exception


Was geht denn und was nicht? Schmeißt er die NPE IMMER oder nur manchmal?


----------



## HimBromBeere (4. Jun 2012)

> Also muss mit myLabel was nicht stimmen


Nö, daran liegt´s schonmal nicht, da kannste sicher sein, denn

```
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 
	
	
	
	





```
createImage
```
 nachschauen.


----------



## Marco13 (4. Jun 2012)

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...)


----------



## Nardian (5. Jun 2012)

Mal ne blöde idee, aber wieso erstellt du ein neues Label?
Wenn du das Bild einfach nur kopieren willst, versuchs doch mal mit


```
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


----------



## Spacerat (5. Jun 2012)

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.

```
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]


----------

