使用Java处理图像和文件处理

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用Java处理图像和文件处理相关的知识,希望对你有一定的参考价值。

  1. 我使用MS Paint绘制了完整的红色图像(红色= 255,蓝色= 0,绿色= 0)
  2. 我将该图像读入File对象file
  3. 然后我使用Files.readAllBytes(file.toPath())将字节提取到字节数组byteArray
  4. 现在我的期望是:

    a)byteArray[0]转换为比特流时,应全部为1

    b)byteArray[1],当转换为比特流时,应全部为0

    c)byteArray[2],当转换为比特流时,应全部为0

因为据我所知,像素值以RGB的顺序存储,每种颜色8位。

当我运行代码时,没有得到预期的结果。 byteArray[0]都为1,但其他2都不为0。

我要去哪里错了?

编辑

根据要求,我包括图像尺寸,保存的格式和用于读取图像的代码。

大小= 1920p x 1080p

格式= JPG

代码:

        File file = new File("image_path.jpg");
        byte byteArray[]= new byte[(int) file.length()];
        try 
            byteArray = Files.readAllBytes(file.toPath());
         catch (IOException e) 
            // TODO Auto-generated catch block
            e.printStackTrace();
        
        int bits[] = new int[8];
        for(int j=0; j<8; j++)
        
            bits[j] = (b[0] & (1 << j))==0 ? 0:1 ;
            //System.out.println("bitsb :"+bitsb[j]);
        

更新

不幸的是,我无法使用其他包含ImageIO库函数的问题。我在这里部分地试图了解图像本身的存储方式,以及如何编写自己的用于检索和处理图像文件的逻辑。

答案

JPEG是一种复杂的图像格式。

它不保存原始图像像素数据,而是具有标题,可选的元数据和压缩的图像数据。

将其解压缩为原始像素值的算法非常复杂,但是有一些库可以为您完成工作。

这里是一个简短的教程:https://docs.oracle.com/javase/tutorial/2d/images/loadimage.html

这里是BufferedImage类的文档,它将保存图像数据:https://docs.oracle.com/javase/7/docs/api/java/awt/image/BufferedImage.html

您将需要使用getRGB功能之一来访问原始像素数据。如果要让每个颜色分量精确地占用1个字节,请确保检查图像是否为24位彩色格式!

JPEG支持其他格式,例如32位和16位!

或者,将图像另存为24位未压缩的BMP。该文件将大很多,但是读取起来要简单得多,因此您不必使用库。只需跳过header,然后读取原始字节即可。

甚至更简单的图像格式为PBM/PPM

以上是关于使用Java处理图像和文件处理的主要内容,如果未能解决你的问题,请参考以下文章

如何在Vue 2中处理文件上传

python:PIL图像处理

C++ 图像处理 - 将图像文件读入二维数组

Java图片缩略图裁剪水印缩放旋转压缩转格式-Thumbnailator图像处理

如何使用 PIG 处理图像文件

java图片处理开源框架