2016-09-20 3 views
1

Im Ändern der Größe .png Bild mit transparencity anzeigt, die auch standardmäßig funktioniert ... bis die Größe ich das Bild:Java, SWT, das Bild transparencity verloren geht, wenn

public Image resize(Image image, int width, int height) 
{ 
    Image scaled = new Image(Display.getDefault(), width, height); 
    scaled.getImageData().transparentPixel = image.getImageData().transparentPixel; 
    GC gc = new GC(scaled); 
    gc.setAntialias(SWT.ON); 
    gc.setInterpolation(SWT.HIGH); 
    gc.drawImage(image, 0, 0,image.getBounds().width, image.getBounds().height, 0, 0, width, height); 
    gc.dispose(); 
    return scaled; 
} 

dann wird die Transparenz, weg kann ich Siehe die "weiße" Farbe

Antwort

2

getImageData() gibt Ihnen eine Kopie der Bilddaten, so dass die Einstellung des transparenten Pixels das ursprüngliche Bild nicht verändert.

Stattdessen müssen Sie ein anderes Bild aus den skalierten Bilddaten mit dem transparenten Pixelsatz erstellen. So etwas wie:

Image scaled = new Image(Display.getDefault(), width, height); 
GC gc = new GC(scaled); 
gc.setAntialias(SWT.ON); 
gc.setInterpolation(SWT.HIGH); 
gc.drawImage(image, 0, 0,image.getBounds().width, image.getBounds().height, 0, 0, width, height); 
gc.dispose(); 

// Image data from scaled image and transparent pixel from original 

ImageData imageData = scaled.getImageData(); 

imageData.transparentPixel = image.getImageData().transparentPixel; 

// Final scaled transparent image 

Image finalImage = new Image(Display.getDefault(), imageData); 

scaled.dispose(); 

Beachten Sie, dass dies nur funktioniert, wenn die ursprünglichen Bilddaten das gleiche Format wie die skalierten Bilddaten (insbesondere die Palettendaten)

Wenn die Daten in einem anderen Format verwendet werden:

ImageData origData = image.getImageData(); 

imageData.transparentPixel = imageData.palette.getPixel(origData.palette.getRGB(origData.transparentPixel)); 
+0

leider seine nicht funktioniert, Transparenz ist immer noch verschwunden (und gc.dispose() bis zur letzten Zeile gehen sollte, da gs noch verwendet wird) –

+1

Möglicherweise werden die Bilddatenformate sind unterschiedlich, wobei in diesem Fall Ausarbeiten der Wert für das transparente Pixel ist härter. Versuchen Sie etwas wie 'imageData.transparentPixel = imageData.getPixel (0, 0);', das das oberste linke Pixel als transparente Farbe verwendet. –

+0

es funktioniert, aber es ist nicht immer der Fall :))) –

Verwandte Themen