2015-06-16 1 views
0

Im using clientcanvas для редактирования изображений в моем приложении, созданных с помощью tabris. Пока это работает неплохо, но мне удалось сохранить отредактированное изображение как новое изображение. Есть ли у кого-нибудь опыт?Сохранение изображения на холсте

ответ

0

Вам необходимо преобразовать swt ImageData в awt BufferedImage и сохранить его. Util для этого может выглядеть следующим образом:

import java.awt.Color; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.image.BufferedImage; 
import java.awt.image.ColorModel; 
import java.awt.image.IndexColorModel; 
import java.awt.image.WritableRaster; 

import org.eclipse.swt.graphics.ImageData; 
import org.eclipse.swt.graphics.PaletteData; 
import org.eclipse.swt.graphics.RGB; 

public class ImageUtil { 

    public static BufferedImage convertToAWT(ImageData data) { 
    BufferedImage imageToDraw = bgToAWT(data, data.width, data.height); 
    BufferedImage result = new BufferedImage(data.width, data.height, BufferedImage.TYPE_INT_RGB); 
    drawWhiteBackground(result); 
    Graphics graphics = result.getGraphics(); 
    graphics.drawImage(imageToDraw, 0, 0, null); 
    graphics.dispose(); 
    return result; 
    } 

    /* 
    * See 
    * http://m4tx.pl/en/2013/01/01/java-swt-to-awt-and-vice-versa-image-conversion 
    * -with-transparency-support/ 
    */ 
    public static BufferedImage bgToAWT(ImageData data, int width, int height) { 
    BufferedImage result = null; 
    ColorModel colorModel = null; 
    PaletteData palette = data.palette; 
    if(palette.isDirect) { 
     BufferedImage bufferedImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB); 
     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, data.getAlpha(x, y) << 24 
             | rgb.red << 16 
             | rgb.green << 8 
             | rgb.blue); 
     } 
     } 
     result = 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(width, 
                            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); 
     } 
     } 
     result = bufferedImage; 
    } 
    return result; 
    } 

    private static void drawWhiteBackground(BufferedImage bufferedImage) { 
    Graphics2D graphics = bufferedImage.createGraphics(); 
    graphics.setColor(new Color(255, 255, 255)); 
    graphics.fillRect(0, 0, bufferedImage.getWidth(), bufferedImage.getHeight()); 
    } 
} 
+0

Так Im загрузки моего изображения в качестве фона в моих Clientcanvas - рисование вещи мне нужно на него впоследствии преобразовать его в BufferedImage, чтобы сохранить рисунки и после этого я преобразовать его обратно к образцу swt снова, чтобы я мог сохранить его в своем приложении? Похоже, много усилий. И как мне получить Drawingdata в мою ImageData? –

 Смежные вопросы

  • Нет связанных вопросов^_^