如何将图像保存为 pdf 但使用 jpeg / png 进行编码

How to save an image to a pdf but encoding using jpeg / png

我试图将图像转换为 PDF 文件,但使用的是 jpeg 和 png 格式。我在文档中读到 PIL 支持此功能,但我尝试过的内容并没有任何效果。我想知道是否有人知道如何使用 pil 或不使用 pil 来做到这一点(我不在乎)。我比较喜欢用python but not closed来用这种方式解决。请参阅下面我尝试过但到目前为止没有取得任何成就的内容。

from PIL import Image
import requests
from io import BytesIO
from pathlib import Path

# my path
url = "https://github.com/tomasmarcos/tomrep/raw/master/image2encode.PNG"
response = requests.get(url)
img = Image.open(BytesIO(response.content))
# convert to binary through threesholding; but this doesnt matter , use "RGB" if you wish
img = img.convert("1")

img.save("example1.pdf", compression = "Flate")
size_in_kilobytes_ex1 = Path("example1.pdf").stat().st_size/1024 # in kilobytes}
img.save("example2.pdf", compression = "JPEG")
size_in_kilobytes_ex2 = Path("example2.pdf").stat().st_size/1024 # in kilobytes}
print(size_in_kilobytes_ex1,size_in_kilobytes_ex2)
#both have same size , it just means that are encoded the same way ; 

我读到 JPEG 使用离散余弦变换并且不能与使用其他编码算法 (Flate) 的 PNG 文件具有相同的大小,所以这是错误的做法。

提前致谢!!

我想出了受@KJ 评论启发的解决方案,使用 img2pdf。问题是当您将图像加载到 ram 内存中时,pil 会自动解码图像,这就是问题所在,库 image2pdf 确实保留了编码,您会看到这是真的,因为我仅通过编码就减少了 pdf 的大小用 png 而不是 jpeg 。如果有人有更好的解决方案,那就太好了。

from PIL import Image
import requests
from io import BytesIO
from pathlib import Path
import img2pdf 

# my path
url = "https://github.com/tomasmarcos/tomrep/raw/master/image2encode.PNG"
response = requests.get(url)
img = Image.open(BytesIO(response.content))
# convert to binary through threesholding; but this doesnt matter , use "RGB" if you wish
img = img.convert("1")

## SOLUTION

img.save("example_png.png") #compression infered by pil as png
img.save("example_jpeg.jpeg") #compression infered by pil as jpeg

# for png
with open("examplepdf_png.pdf","wb") as f:
    f.write(img2pdf.convert("example_png.png"))
#for jpeg
with open("examplepdf_jpeg.pdf","wb") as f:
    f.write(img2pdf.convert("example_jpeg.jpeg"))
    
size_in_kilobytes_png = Path("examplepdf_png.pdf").stat().st_size/1024 # in kilobytes}
size_in_kilobytes_jpeg = Path("examplepdf_jpeg.pdf").stat().st_size/1024 # in kilobytes}

print(size_in_kilobytes_jpeg,size_in_kilobytes_png)
#both DO NOT have the same size , it just means that are encoded in a different way
# , see they are the same image but different encoding!

附加信息: 根据经验,当谈到查看图像的大小时(哪种压缩效果更好?):

• rgb 图像首选 jpeg 而不是 png;对于灰度/二​​值图像,png 优于 jpeg

• 图片的分辨率越高,您就越会注意到这种差异。