# png transparenz geschwindigkeitsproblem



## Gast (5. Jan 2008)

Ich habe einige pngs die ich in bufferedimages lade und dann zeichne. Wenn ich das so mache


```
imagelist[62] = ImageIO.read(getClass().getResource("/resource/image_selected_4.png")); //$NON-NLS-1$
```

braucht mein code 200 ms zum Zeichnen (viel zu lange).

Jetzt hab ich schon im internet und forum herumgestöbert und meine code adaptiert;


```
GraphicsEnvironment e = GraphicsEnvironment.getLocalGraphicsEnvironment();
		        GraphicsDevice d = e.getDefaultScreenDevice();
		        GraphicsConfiguration c = d.getDefaultConfiguration();
		       
		        newimglist[i] = c.createCompatibleImage(
		        	imagelist[i].getWidth(), imagelist[i].getHeight(), BufferedImage.TYPE_INT_ARGB_PRE);
		        newimglist[i].getGraphics().drawImage(imagelist[i],0,0, null);
```

Das hat mein rendern auf 100 ms heruntergebracht, braucht aber immer noch sehr lange. Mit diesem code schaut das final gezeichnete Bild nach wie vor korrekt aus.

Jetzt hab ich mich mal mit der Transparenz der pngs beschäftigt, und habe statt BufferedImage.TYPE_INT_ARGB_PRE, BufferedImage.TYPE_INT_ARGB verwendet. Jetzt dauert das rendern nur mehr 5 ms. Damit kann ich dann sehr gut leben.

Mein Problem ist nur das die grafik jetzt nicht richtig ausschaut. Ich kann nicht genau sagen was falsch ist, aber es fehlt irgendwie eine gewisse 'Schärfe' des Gesamtbildes. Da ich leider die javadoc zu TYPE_INT_ARGB_PRE nicht ganz verstehe (was genau bedeutet 'premultiplied with alpha'?) weis ich nicht was ich machen soll. Grundsätzlich möchte ich natürlich beim dem Verfahren bleiben das schneller ist, nur schaut es halt nicht so gut aus. Gibt es eine Möglichkeit das ich die pngs irgendwie ändere (Transparenz muss ich aber haben) damit das rendern schneller geht. (Die pngs zeichnet mir ein freund, ich hab da nicht so viel damit am hut)


----------



## Quaxli (6. Jan 2008)

Gleich mal eine Frage vorweg, weil Du das nicht geschrieben hast: Wo hast Du ImageIO.read(..) plaziert. Poste mal ein bißchen Code außen rum. 
Auch bei Deinem 2. Code-Beispiel läßt sich nicht erkennen, wo und wie Du es letztendlich eingebaut hast und hier kann man durchaus einige Fehler machen.


----------



## Gast (6. Jan 2008)

Hm, den Code posten geht nicht, der ist etwas zu lange. Aber mal schauen was sich machen lässt wenn ich selektiv poste.  :wink: 

Das Einlesen findet kurz nach dem Programmstart statt. Oder was meinst du genau mit 'wo hab ichs platziert'?

Hier mal ein etwas größeres snipplet (Eigentlich nur die beiden vorigen zusammen);


```
imagelist[61] = ImageIO.read(getClass().getResource("/resource/tendency_down_large.png")); //$NON-NLS-1$
			imagelist[62] = ImageIO.read(getClass().getResource("/resource/image_selected_4.png")); //$NON-NLS-1$

			// Create system compatible images (with the right transparency-mode)
			final BufferedImage[] newimglist = new BufferedImage[imagelist.length];
			for (int i = 0; i < imagelist.length; i++) {
				final GraphicsEnvironment e = GraphicsEnvironment.getLocalGraphicsEnvironment();
				final GraphicsDevice d = e.getDefaultScreenDevice();
				final GraphicsConfiguration c = d.getDefaultConfiguration();

				newimglist[i] = c.createCompatibleImage(imagelist[i].getWidth(), imagelist[i].getHeight(),
					BufferedImage.TYPE_INT_ARGB);
				newimglist[i].getGraphics().drawImage(imagelist[i], 0, 0, null);
			}
			imagelist = newimglist;
		} catch (final IOException e) {
			logger.fatal("Error while loading images! " + e); //$NON-NLS-1$
		}
```

Das ganze ist im Konstruktor meine ImageCache Klasse. Diese ist ein Singleton und wir wie bereits erwähnt, kurz nach dem Programmstart und lange vor dem rendern aufgerufen (also getInstance() wird aufgerufen).


Code zum Rendern werd ich mal nicht posten, schlussendlich wird alles ja nur mit g.drawImage(bild,x,y,observer) gezeichnet. (Wenns hilft poste ich ihn aber gerne).


----------

