Несколько платформ должны быть в порядке, это просто Windows, Linux и Apple. Я просто позабочусь о том, чтобы получить правильную сборку для правильной платформы, только 32-битную. Я не думаю, что использование веб-сервиса было бы жизнеспособным решением в этом случае: это изменение размера очень большой очереди.

риложение должно изменить размер ImageData. К сожалению, я не получил желаемых результатов с помощью GC (с включенным сглаживанием и высокой интерполяцией) или ImageData.scaledTo (). Полученное изображение имеет слишком низкое качество, чтобы быть приемлемым. Какой лучший способ сделать высококачественное изменение размера ImageData?

Редактировать: Я уменьшаю

 Jonah20 янв. 2011 г., 23:59
Ах да, забыл уточнить. Вниз.
 horatio20 янв. 2011 г., 22:24
Вы увеличиваете или уменьшаете масштаб?

Ответы на вопрос(3)

Решение Вопроса

уменьшения масштаба,Усреднение площади предлагает лучшее качество. Конечно, можно было бы повторно реализовать алгоритм масштабирования усреднения площади для SWT или для быстрого решения, которого часто достаточно:

перерабатывать SWT образв AWT образотмасштабировать это использование соответствующего режима (усреднение области при уменьшении масштаба, билинейный в противном случае)преобразовать его обратно к SWT-изображению

Код для преобразования между SWT и AWT изображениями можно найтиВот.

/**
 * Resizes an image, using the given scaling factor. Constructs a new image resource, please take care of resource
 * disposal if you no longer need the original one. This method is optimized for quality, not for speed.
 * 
 * @param image source image
 * @param scale scale factor (<1 = downscaling, >1 = upscaling)
 * @return scaled image
 */
public static org.eclipse.swt.graphics.Image resize (org.eclipse.swt.graphics.Image image, float scale) {
    int w = image.getBounds().width;
    int h = image.getBounds().height;

    // convert to buffered image
    BufferedImage img = convertToAWT(image.getImageData());

    // resize buffered image
    int newWidth = Math.round(scale * w);
    int newHeight = Math.round(scale * h);

    // determine scaling mode for best result: if downsizing, use area averaging, if upsizing, use smooth scaling
    // (usually bilinear).
    int mode = scale < 1 ? BufferedImage.SCALE_AREA_AVERAGING : BufferedImage.SCALE_SMOOTH;
    java.awt.Image scaledImage = img.getScaledInstance(newWidth, newHeight, mode);

    // convert the scaled image back to a buffered image
    img = new BufferedImage(newWidth, newHeight, BufferedImage.TYPE_INT_RGB);
    img.getGraphics().drawImage(scaledImage, 0, 0, null);

    // reconstruct swt image
    ImageData imageData = convertToSWT(img);
    return new org.eclipse.swt.graphics.Image(Display.getDefault(), imageData);
}

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);
        WritableRaster raster = bufferedImage.getRaster();
        int[] pixelArray = new int[3];
        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);
                pixelArray[0] = rgb.red;
                pixelArray[1] = rgb.green;
                pixelArray[2] = rgb.blue;
                raster.setPixels(x, y, 1, 1, pixelArray);
            }
        }
        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;
    }
}

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);
        WritableRaster raster = bufferedImage.getRaster();
        int[] pixelArray = new int[3];
        for (int y = 0; y < data.height; y++) {
            for (int x = 0; x < data.width; x++) {
                raster.getPixel(x, y, pixelArray);
                int pixel = palette.getPixel(new RGB(pixelArray[0], pixelArray[1], pixelArray[2]));
                data.setPixel(x, y, pixel);
            }
        }
        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;
}
 Jonah21 мая 2012 г., 19:01
Это то, что я в итоге сделал.
 Samuli Kärkkäinen10 окт. 2013 г., 09:46
Похоже, это превращает прозрачность в черный. Можно ли это изменить так, чтобы прозрачность стала белой или, что еще лучше, сохранилась?

с которым я столкнулся, который изменяет размеры и сохраняет прозрачность:

public static Image resize(Image image, int width, int height) {
  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.dispose(); // don't forget about me!
  return scaled;
}

Я нашел это здесь:

http://aniszczyk.org/2007/08/09/resizing-images-using-swt/

http://www.jmagick.org/index.html

Единственная проблема заключается в том, что если изображения загружаются пользователем и у вас большая база пользователей, у вас будут утечки памяти из-за неправильных файлов изображений и так далее.

 Jonah21 янв. 2011 г., 02:39
Несколько платформ должны быть в порядке, это просто Windows, Linux и Apple. Я просто позабочусь о том, чтобы получить правильную сборку для правильной платформы, только 32-битную. Я не думаю, что использование веб-сервиса было бы жизнеспособным решением в этом случае: это изменение размера очень большой очереди.
 Zeki21 янв. 2011 г., 02:18
Да. Вам также нужно будет распространять imageMagick. Я не уверен, как это будет, если ваши пользователи на разных платформах. Другой вариант - создать веб-сервис и использовать приложение на рабочем столе для удаленной службы. Могу поспорить, вы могли бы найти сервис, который делает это и полностью обойти проблему.
 Jonah21 янв. 2011 г., 02:11
На самом деле это настольное приложение, поэтому проблем быть не должно. Значит, мне придется распространять ImageMagick вместе с моим приложением?

Ваш ответ на вопрос