SWT et redimensionnement d’images
• • ☕️ 1 min readDes fonctions simples pour les redimensionnement d’images en SWT/jFace :
Il existe 2 techniques :
- en utilisant ImageData.scaleTo (basse qualité)
- en utilisant un GC sur une Image et en appelant GC.drawImage (haute qualité)
La deuxième solutions alloue des ressources systèmes, mais bénéficie du coup des accélérations matérielles et du anti-aliasing : Pour définir l’anti-aliasing, utilisez GC.setAntialias(SWT.ON ou SWT.DEFAULT ou SWT.NONE); La qualité se règle avec GC.setInterpolation(SWT.DEFAULT ou SWT.NONE ou SWT.LOW ou SWT.HIGH);
Attention aux valeurs défaut qui ne semble-t-il ne sont pas les même en fonction de la plateforme… En tout cas, sur windows : DEFAULT = NONE.
/**
* Returns a new scaled image. new Image must be disposed after use.
*
* @param image
* @param width
* @param height
* @return
*/
public static Image resize(Image image, int width, int height) {
if (image == null)
return null;
final 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();
return scaled;
}
public static ImageData resize(ImageData imageData, int width, int height, boolean antiAliasing) {
if (imageData == null)
return null;
if (imageData.width == width && imageData.height == height)
return imageData;
if (antiAliasing) {
Image tmpImage = null;
Image fullImage = new Image(Display.getCurrent(), imageData);
ImageData result = null;
tmpImage = resize(fullImage, width, height);
result = tmpImage.getImageData();
tmpImage.dispose();
fullImage.dispose();
return result;
}
return imageData.scaledTo(width, height);
}
Je suis sûr que ça pourra aider quelqu’un :-)