преобразование GIF изображения в пиксели, а затем обратно в GIF - PullRequest
0 голосов
/ 29 марта 2010

Моя настоящая цель - прочитать значения из графика в формате GIF, в какую-то значимую структуру данных, но для начала мне нужно иметь возможность прочитать цвет каждого пикселя рассматриваемого GIF.

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

после прочтения этого поста Я пытался сделать что-то подобное, однако мой выходной GIF всегда выходит полностью черным.

Может кто-нибудь сказать мне, что я неправильно понял?

BufferedImage bi = ImageIO.read(new URL("http://upload.wikimedia.org/wikipedia/commons/3/36/Sunflower_as_GIF.gif"));
int x = 100;
int y = 100;
int width = 100;
int height = 100;
int[] data = grabPixels(bi, x, y, width, height);
BufferedImage img = createImage(data, width, height);
ImageIO.write(img, "gif", new File("part.gif"));

...

private int[] grabPixels(BufferedImage img, int x, int y, int width, int height)
{
    try
    {
        PixelGrabber pg = new PixelGrabber(img, x, y, width, height, true);
        pg.grabPixels();
        if ((pg.getStatus() & ImageObserver.ABORT) != 0)
            throw new RuntimeException("image fetch aborted or errored");
        return convertPixels((int[]) pg.getPixels(), width, height);
    }
    catch (InterruptedException e)
    {
        throw new RuntimeException("interrupted waiting for pixels", e);
    }
}

public int[] convertPixels(int[] pixels, int width, int height)
{
    int[] newPix = new int[width * height * 3];
    int n = 0;
    for (int j = 0; j < height; j++)
    {
        for (int i = 0; i < width; i++)
        {
            int pixel = pixels[j * width + i];
            newPix[n++] = (pixel >> 16) & 0xff;
            newPix[n++] = (pixel >> 8) & 0xff;
            newPix[n++] = (pixel) & 0xff;
        }
    }
    return newPix;
}

private BufferedImage createImage(int[] pixels, int width, int height)
{
    BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
    WritableRaster raster = (WritableRaster) image.getData();
    raster.setPixels(0, 0, width, height, pixels);
    return image;
}

1 Ответ

0 голосов
/ 29 марта 2010

Все черные звучат как нули, как будто изображение еще не загружено. Вы можете проверить результат, возвращенный grabPixels() или указать время ожидания. Получив BufferedImage, вы сможете использовать getRaster() и работать с WritableRaster.

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