使用PIL图像读取jpg文件相当于什么?

What is the equivalent of reading a jpg file using PIL image?

使用 python 3.10.

我的问题是我将 jpg 文件读取为二进制文件,并得到一个字节数组。 我有以下代码:

from PIL import Image

def get_image_bytes_from_file(filename: str):
    with open(filename, "rb") as f:
        image_read = f.read()
        return image_read


input_file = './image.jpg'

image = Image.open(input_file)
pil_bytes = image.tobytes()

normal_read_bytes = get_image_bytes_from_file(input_file)

print('hi')

我需要对 pil_bytes 进行什么调用才能等于 normal_read_bytesenter code here

我该怎么做?

当你这样做时:

with open('image.jpg', "rb") as f:
    JPEG = f.read()

您名为 JPEG 的变量将包含完整的 JPEG 图像:

  • a 图像开始 标记,SOI (0xFF 0xD8)
  • 一个APP0标记,(0xFF 0xE0)带有JFIF版本和水平和垂直dpi
  • 量化表和霍夫曼表
  • 可能是带有 GPS 纬度、经度、相机品牌、相机型号、照片日期等的 EXIF 数据
  • a 帧开始 标记,SOF0,每像素位数,图像宽度和高度,通道数,采样因子
  • JPEG-compressed 像素
  • EOI,图像结束 标记 (0xFF 0xD9)

这是一个完整的 JPEG-encoded 压缩图像,带有一堆元数据。


执行此操作时,PIL 会将 JPEG 数据解压缩为完全展开的 in-memory 表示形式,准备好进行处理:

im = Image.open('image.jpg')
pixels = im.tobytes()

您的变量 pixels 将仅包含图像的 未压缩像素 ,从图像的 top-left 开始按 RGB 顺序排列。没有 EXIF 数据、没有日期、没有 GPS、没有评论、没有相机品牌、没有相机型号或镜头数据。它将始终具有完整的未压缩大小:

height in pixels * width width in pixels * 3 bytes

因此,如果您的图像的顶行是白色,它将开始:

0xFF 0xFF 0xFF 0xFF ...

纯像素数据


希望您现在可以看出两者之间的区别,那么您想做什么...