Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 将gif图像转换为像素,然后再转换回gif_Java_Image Processing - Fatal编程技术网

Java 将gif图像转换为像素,然后再转换回gif

Java 将gif图像转换为像素,然后再转换回gif,java,image-processing,Java,Image Processing,我真正的目标是将GIF格式的图形中的值读取到一些有意义的数据结构中,但为了开始,我需要能够读取所讨论的GIF的每个像素的颜色 为了测试这一点,我想将正在读取的GIF片段保存到文件中,以便进行视觉分析,但遇到了问题 在阅读之后,我尝试做一些类似的事情,但是我的输出GIF总是显示为完全黑色 谁能告诉我我误解了什么 BufferedImage bi = ImageIO.read(new URL("http://upload.wikimedia.org/wikipedia/commons/3/36/Su

我真正的目标是将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"));


所有的黑色听起来像零,好像图像还没有加载。您可以检查返回的结果或指定超时。一旦有了BuffereImage,您就可以使用可写光栅了。

如果您使用的是图像或硬盘驱动程序,而不是internet上的图像或硬盘驱动程序,会发生什么情况?
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;
}