| /******************************************************************************* |
| * Copyright (c) 2018 Agence spatiale canadienne / Canadian Space Agency. |
| * All rights reserved. This program and the accompanying materials |
| * are made available under the terms of the Eclipse Public License v1.0 |
| * which accompanies this distribution, and is available at |
| * http://www.eclipse.org/legal/epl-v10.html |
| * |
| * Contributors: |
| * Pierre Allard - initial API and implementation |
| * Regent L'Archeveque |
| * |
| * SPDX-License-Identifier: EPL-1.0 |
| *******************************************************************************/ |
| package org.eclipse.apogy.addons.vehicle.ui.utils; |
| |
| import java.awt.image.BufferedImage; |
| import java.awt.image.ColorModel; |
| import java.awt.image.DirectColorModel; |
| import java.awt.image.IndexColorModel; |
| import java.awt.image.WritableRaster; |
| |
| import org.eclipse.swt.graphics.GC; |
| import org.eclipse.swt.graphics.Image; |
| import org.eclipse.swt.graphics.ImageData; |
| import org.eclipse.swt.graphics.PaletteData; |
| import org.eclipse.swt.graphics.RGB; |
| import org.eclipse.swt.widgets.Display; |
| |
| public class ImageUtils { |
| public static ImageData convertToSWT(BufferedImage bufferedImage) { |
| if (bufferedImage.getColorModel() instanceof DirectColorModel) { |
| DirectColorModel colorModel = (DirectColorModel) bufferedImage.getColorModel(); |
| PaletteData palette = new PaletteData(colorModel.getRedMask(), colorModel.getGreenMask(), |
| colorModel.getBlueMask()); |
| ImageData data = new ImageData(bufferedImage.getWidth(), bufferedImage.getHeight(), |
| colorModel.getPixelSize(), palette); |
| for (int y = 0; y < data.height; y++) { |
| for (int x = 0; x < data.width; x++) { |
| int rgb = bufferedImage.getRGB(x, y); |
| int pixel = palette.getPixel(new RGB((rgb >> 16) & 0xFF, (rgb >> 8) & 0xFF, rgb & 0xFF)); |
| data.setPixel(x, y, pixel); |
| if (colorModel.hasAlpha()) { |
| data.setAlpha(x, y, (rgb >> 24) & 0xFF); |
| } |
| } |
| } |
| return data; |
| } else if (bufferedImage.getColorModel() instanceof IndexColorModel) { |
| IndexColorModel colorModel = (IndexColorModel) bufferedImage.getColorModel(); |
| int size = colorModel.getMapSize(); |
| byte[] reds = new byte[size]; |
| byte[] greens = new byte[size]; |
| byte[] blues = new byte[size]; |
| colorModel.getReds(reds); |
| colorModel.getGreens(greens); |
| colorModel.getBlues(blues); |
| RGB[] rgbs = new RGB[size]; |
| for (int i = 0; i < rgbs.length; i++) { |
| rgbs[i] = new RGB(reds[i] & 0xFF, greens[i] & 0xFF, blues[i] & 0xFF); |
| } |
| PaletteData palette = new PaletteData(rgbs); |
| ImageData data = new ImageData(bufferedImage.getWidth(), bufferedImage.getHeight(), |
| colorModel.getPixelSize(), palette); |
| data.transparentPixel = colorModel.getTransparentPixel(); |
| WritableRaster raster = bufferedImage.getRaster(); |
| int[] pixelArray = new int[1]; |
| for (int y = 0; y < data.height; y++) { |
| for (int x = 0; x < data.width; x++) { |
| raster.getPixel(x, y, pixelArray); |
| data.setPixel(x, y, pixelArray[0]); |
| } |
| } |
| return data; |
| } |
| return null; |
| } |
| |
| public static BufferedImage convertToAWT(ImageData data) { |
| ColorModel colorModel = null; |
| PaletteData palette = data.palette; |
| if (palette.isDirect) { |
| colorModel = new DirectColorModel(data.depth, palette.redMask, palette.greenMask, palette.blueMask); |
| BufferedImage bufferedImage = new BufferedImage(colorModel, |
| colorModel.createCompatibleWritableRaster(data.width, data.height), false, null); |
| for (int y = 0; y < data.height; y++) { |
| for (int x = 0; x < data.width; x++) { |
| int pixel = data.getPixel(x, y); |
| RGB rgb = palette.getRGB(pixel); |
| bufferedImage.setRGB(x, y, rgb.red << 16 | rgb.green << 8 | rgb.blue); |
| } |
| } |
| return bufferedImage; |
| } else { |
| RGB[] rgbs = palette.getRGBs(); |
| byte[] red = new byte[rgbs.length]; |
| byte[] green = new byte[rgbs.length]; |
| byte[] blue = new byte[rgbs.length]; |
| for (int i = 0; i < rgbs.length; i++) { |
| RGB rgb = rgbs[i]; |
| red[i] = (byte) rgb.red; |
| green[i] = (byte) rgb.green; |
| blue[i] = (byte) rgb.blue; |
| } |
| if (data.transparentPixel != -1) { |
| colorModel = new IndexColorModel(data.depth, rgbs.length, red, green, blue, data.transparentPixel); |
| } else { |
| colorModel = new IndexColorModel(data.depth, rgbs.length, red, green, blue); |
| } |
| BufferedImage bufferedImage = new BufferedImage(colorModel, |
| colorModel.createCompatibleWritableRaster(data.width, data.height), false, null); |
| WritableRaster raster = bufferedImage.getRaster(); |
| int[] pixelArray = new int[1]; |
| for (int y = 0; y < data.height; y++) { |
| for (int x = 0; x < data.width; x++) { |
| int pixel = data.getPixel(x, y); |
| pixelArray[0] = pixel; |
| raster.setPixel(x, y, pixelArray); |
| } |
| } |
| return bufferedImage; |
| } |
| } |
| |
| /** |
| * Applies an overlay image on top of an original image. |
| * |
| * @param cameraImage The original image. |
| * @param overlayedImage The overlay image. Can be null. |
| * @return A copy of the original image with the overlay image added on top. |
| */ |
| public static Image applyOverlay(Image cameraImage, Image overlayedImage) { |
| if (overlayedImage != null) { |
| ImageData imgdata = overlayedImage.getImageData().scaledTo(cameraImage.getBounds().width, |
| cameraImage.getBounds().height); |
| |
| Image resizedOverlays = new Image(Display.getDefault(), imgdata); |
| Image result = new Image(Display.getDefault(), cameraImage.getBounds().width, |
| cameraImage.getBounds().height); |
| |
| GC gc = new GC(result); |
| gc.drawImage(cameraImage, 0, 0); |
| gc.drawImage(resizedOverlays, 0, 0); |
| gc.dispose(); |
| |
| resizedOverlays.dispose(); |
| |
| return result; |
| } else { |
| // Returns a copy of the original. |
| return ImageUtils.copyImage(cameraImage); |
| } |
| } |
| |
| /** |
| * Creates a copy of an image. |
| * |
| * @param originalImage The image to copy. Should not be null. |
| * @return The copied image. |
| */ |
| public static Image copyImage(final Image originalImage) { |
| ImageData imageData = originalImage.getImageData(); |
| return new Image(Display.getCurrent(), imageData); |
| } |
| } |