我已经问过这个问题,但我没有得到满意的答案,因此我进行了更多研究,并以一种更好的方式提出了这个问题。我通过OpenCV
imread
方法读取图像。我使用imwrite
方法将其保存。它将输出文件的大小增加两倍以上。
下面是我从imagemagick获得的图像的详细信息(我没有写下所有细节,我需要为所有细节附加图像):
输入图像:
- 格式:JPEG(联合图像专家组JFIF格式)
- MIME类型:image / jpeg
- 类别:DirectClass
- 几何:1836x3264 + 0 + 0
- 分辨率:72x72
- 打印尺寸:25.5x45.3333
- 单位:PixelsPerInch
- 类型:TrueColor
- Endianess:未定义
- 颜色空间:sRGB
- 深度:8位
- 频道深度: 红色:8位 绿色:8位 蓝色:8位
- 渠道统计信息: 像素:5992704
- 压缩:JPEG
- 质量:75
- 文件大小:267KB
- 像素数:5.993M
输出图像:
- 格式:JPEG(联合图像专家组JFIF格式)
- MIME类型:image / jpeg
- 类别:DirectClass
- 几何:1836x3264 + 0 + 0
- 单位:未定义
- 类型:TrueColor
- Endianess:未定义
- 颜色空间:sRGB
- 深度:8位
- 频道深度: 红色:8位 绿色:8位 蓝色:8位
- 渠道统计信息: 像素:5992704
- 压缩:JPEG
- 质量:95
- 文件大小:611KB
- 像素数:5.993M
如您所见,输入图像大小为267KB,但输出图像大小为611KB。现在,我知道它的大小取决于编码器,压缩值,比特率等。我想知道是否可以将图像保存为与输入图像完全相同的大小。
我还尝试过像openCV
这样在cv2.imwrite('result.jpg', image, [int(cv2.IMWRITE_JPEG_QUALITY), 45])
中使用压缩,此处的图像质量为45,但是图像大小仍将大于输入图像(大约300KB)。我不想低于45,因为这会影响图像细节和数据丢失。
我尝试使用scipy,matplotlib等外部库。但是无论如何,它们都会增大图像的大小。
任何关于输出图像为何增加以及我们如何解决它的线索都将受到赞赏。谢谢。
这里有一些代码可供参考
import cv2 #opencv library for image processing implementations
def main():
im = cv2.imread('sample.jpg')
cv2.imwrite('result.jpg', im)
if(__name__=='__main__'):
main()
答案 0 :(得分:1)
您的原始图像的质量为75。如果您未定义OpenCV的保存质量,则默认值为95,因此您应该期望文件更大。
如果要将其设置为最大大小,可以使用 ImageMagick 将其设置为300kB:
convert sample.jpg -define jpeg:extent=300k a.jpg
这将为您提供质量为83的299,810字节文件。
如果您准备允许400kB,则可以使用:
convert sample.jpg -define jpeg:extent=400k a.jpg
您将获得质量为93的358,000字节文件。
我在Python中编写了类似的内容,使您可以使用二进制搜索here以指定的大小保存。