使用Java处理图像和文件处理
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用Java处理图像和文件处理相关的知识,希望对你有一定的参考价值。
- 我使用MS Paint绘制了完整的红色图像(红色= 255,蓝色= 0,绿色= 0)
- 我将该图像读入File对象
file
- 然后我使用
Files.readAllBytes(file.toPath())
将字节提取到字节数组byteArray
中 现在我的期望是:
a)
byteArray[0]
转换为比特流时,应全部为1b)
byteArray[1]
,当转换为比特流时,应全部为0c)
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处理图像和文件处理的主要内容,如果未能解决你的问题,请参考以下文章