【问题标题】:Java Convert PPM Byte array to JPG imageJava将PPM字节数组转换为JPG图像
【发布时间】:2015-07-24 07:25:16
【问题描述】:

目前正在研究 Java 中的图像处理

我有大小为 921600 (640*480*3) 的字节 array(PPM)

byte[] image; // PPM

BufferedImage image = ImageIO.read(new ByteArrayInputStream(image));

图像为空。

尝试使用 ImageMagicJAI 库。但这对我没有帮助。

是否可以从字节数组中获取RGB分量并将其转换为JPG文件。

感谢任何帮助。

【问题讨论】:

  • 在这里查看解决方案stackoverflow.com/questions/9943962/…
  • 如果您的byte[] image 实际上是一个 PPM 文件(或 PPM 格式的字节),JAI ImageIO (jai_imageio.jar) 将能够读取它。但是,从您的回答来看,它似乎只是“原始”像素(即宽度、高度和 maxval 应该以 PPM 格式存储在 内部字节数组中)。

标签: java bytearray jpeg bufferedimage ppm


【解决方案1】:

下面是代码(它将 PPM(字节数组转换为缓冲图像,您可以将缓冲图像保存到文件中)

// 方法调用

BufferedImage image = ppm(width, height, 255, byte[]);

//方法定义

static public BufferedImage ppm(int width, int height, int maxcolval, byte[] data){
        if(maxcolval<256){
            BufferedImage image=new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB);
            int r,g,b,k=0,pixel;
            if(maxcolval==255){                                      // don't scale
                for(int y=0;y<height;y++){
                    for(int x=0;(x<width)&&((k+3)<data.length);x++){
                        r=data[k++] & 0xFF;
                        g=data[k++] & 0xFF;
                        b=data[k++] & 0xFF;
                        pixel=0xFF000000+(r<<16)+(g<<8)+b;
                        image.setRGB(x,y,pixel);
                    }
                }
            }
            else{
                for(int y=0;y<height;y++){
                    for(int x=0;(x<width)&&((k+3)<data.length);x++){
                        r=data[k++] & 0xFF;r=((r*255)+(maxcolval>>1))/maxcolval;  // scale to 0..255 range
                        g=data[k++] & 0xFF;g=((g*255)+(maxcolval>>1))/maxcolval;
                        b=data[k++] & 0xFF;b=((b*255)+(maxcolval>>1))/maxcolval;
                        pixel=0xFF000000+(r<<16)+(g<<8)+b;
                        image.setRGB(x,y,pixel);
                    }
                }
            }
            return image;
        }
        else{


            BufferedImage image=new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB);
            int r,g,b,k=0,pixel;
            for(int y=0;y<height;y++){
                for(int x=0;(x<width)&&((k+6)<data.length);x++){
                    r=(data[k++] & 0xFF)|((data[k++] & 0xFF)<<8);r=((r*255)+(maxcolval>>1))/maxcolval;  // scale to 0..255 range
                    g=(data[k++] & 0xFF)|((data[k++] & 0xFF)<<8);g=((g*255)+(maxcolval>>1))/maxcolval;
                    b=(data[k++] & 0xFF)|((data[k++] & 0xFF)<<8);b=((b*255)+(maxcolval>>1))/maxcolval;
                    pixel=0xFF000000+(r<<16)+(g<<8)+b;
                    image.setRGB(x,y,pixel);
                }
            }
            return image;
        }
    }

【讨论】:

  • 如何在 Kotlin/Android 中编写它?
  • @AlanDonizete 我相信您可以使用相同的功能。但是,我对 Android 知之甚少。
  • 我不得不改变一些东西,但可以让它工作,谢谢! (遗憾的是,我无法再访问代码,所以我不能在这里发布)
【解决方案2】:

您可以使用WritableRaster 为您设置图像中的像素:


对于灰度图像,您将有一个像这样的字节数组:

byte[] arr = new byte[width * height];

要制作图像,请使用:

BufferedImage img = new BufferedImage(width, height, BufferedImage.TYPE_BYTE_GRAY);
img.getRaster().setDataElements(0, 0, width, height, arr);

对于彩色图像,您将有一个这样的数组:

byte[] arr = new byte[width * height * 3];

因此,要制作图像,请使用:

BufferedImage img = new BufferedImage(width, height, BufferedImage.TYPE_3BYTE_BGR);
img.getRaster().setDataElements(0, 0, width, height, arr);

您可能需要将第一行中的 TYPE 弄乱。请参阅here 以选择您的图片类型。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-10
    • 2022-11-30
    • 1970-01-01
    • 2014-10-20
    • 2019-05-10
    • 1970-01-01
    相关资源
    最近更新 更多