Java-эквивалент JavaScript Canvas getImageData - PullRequest
4 голосов
/ 08 февраля 2011

Я портирую образец HTML5 Canvas на Java, пока все хорошо, пока не получу вызов этой функции:

Canvas.getContext('2d').getImageData(0, 0, 100, 100).data

Я некоторое время гуглил и нашел эту страницу спецификации холста

http://www.whatwg.org/specs/web-apps/current-work/multipage/the-canvas-element.html#pixel-manipulation

После прочтения я создал эту функцию ниже:

public int[] getImageDataPort(BufferedImage image) {
    int width = image.getWidth();
    int height = image.getHeight();

    int[] ret = new int[width * height * 4];

    int idx = 0;
    for (int y = 0; y < height; y++) {
        for (int x = 0; x < width; x++) {
            int color = image.getRGB(x, y);

            ret[idx++] = getRed(color);
            ret[idx++] = getGreen(color);
            ret[idx++] = getBlue(color);
            ret[idx++] = getAlpha(color);
        }
    }
    return ret;
}

public int getRed(int color) {
    return (color >> 16) & 0xFF;
}

public int getGreen(int color) {
    return (color >> 8) & 0xFF;
}

public int getBlue(int color) {
    return (color >> 0) & 0xFF;
}

public int getAlpha(int color) {
    return (color >> 24) & 0xff;
}

В Java Graphics API есть какой-либо класс, в который встроена эта функция, или я должен использовать тот, который я создал?

Ответы [ 3 ]

1 голос
/ 08 февраля 2011

Спасибо aioobe, я посмотрел на класс WritableRaster и нашел функцию getPixels, которая делает именно то, что мне нужно, конечный результат:

public int[] getImageDataPort(BufferedImage image) {
    int width = image.getWidth();
    int height = image.getHeight();

    int[] ret = null;

    ret = image.getRaster().getPixels(0, 0, width, height, ret);

    return ret;
}

Единственная проблема, которая может произойтиэто когда image.getType не является типом, который поддерживает альфа по сравнению с кодом вопроса, что приводит к уменьшению int[] ret, но можно просто преобразовать тип изображения с помощью:

public BufferedImage convertType(BufferedImage image,int type){
    BufferedImage ret = new BufferedImage(image.getWidth(), image.getHeight(), type);
    ColorConvertOp xformOp = new ColorConvertOp(null);
    xformOp.filter(image, ret);
    return ret;
}
1 голос
/ 08 февраля 2011

Я думаю, что в стандартном Java API вы найдете класс Raster.Вы можете получить от WritableRaster (используется для низкоуровневой обработки изображений) до BufferedImage.getRaster.Класс Raster затем предоставляет такие методы, как getSamples, который заполняет int[] данными изображения.

0 голосов
/ 08 февраля 2011

Попробуйте

ByteArrayOutputStream baos = new ByteArrayOutputStream();
ImageIO.write(bi, "jpg", baos);

, где bi - BufferendImage

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...