我正在尝试使用以下代码将 bmp 图像转换为 jpeg。
from PIL import Image
img = Image.open('/Desktop/xyz.bmp')
new_img = img.resize( (256, 256) )
new_img.save( '/Desktop/abc.png', 'png')
当执行出现错误时,
Traceback (most recent call last): File "D:/widowed_hulk/otokar/image_scraper.py", line 80, in <module>
img = Image.open('C:/Users/santhosh.solomon/Desktop/bmp/ImageHandler.bmp') File "C:Python34libsite-packagesPILImage.py", line 2609, in open
im = _open_core(fp, filename, prefix) File "C:Python34libsite-packagesPILImage.py", line 2599, in _open_core
im = factory(fp, filename) File "C:Python34libsite-packagesPILImageFile.py", line 102, in
__init__
self._open() File "C:Python34libsite-packagesPILBmpImagePlugin.py", line 201, in
_open
self._bitmap(offset=offset) File "C:Python34libsite-packagesPILBmpImagePlugin.py", line 161, in
_bitmap
raise IOError("Unsupported BMP compression (%d)" % file_info['compression']) OSError: Unsupported BMP compression (1)
我正在尝试转换的图像:https://servis.otokar.com.tr:8083/ImageHandler.ashx?id=6425
任何人都可以指导我解决此错误吗?
这不是你自己的错。该图像采用尴尬Microsoft BMP V3格式,我相信RLE压缩,我不相信Pillow可以处理。
您可以使用ImageMagick在终端中重写图像而无需压缩,如下所示,然后您的代码将正常工作:
convert image.bmp -compress none image.bmp
但是如果你这样做,你也可以使用ImageMagick来制作PNG:
convert image.bmp result.png
作为替代方案,如果您想使用 Python,您可以尝试其他库,例如pyvips
- 我会尝试并报告。
在尝试了许多可能的方法之后,我找到了 openCV 库的解决方案。这不会给我带来任何压缩错误,并且像魅力一样处理转换。
import cv2
image = cv2.imread(img)
cv2.imwrite(imag_name.replace('.bmp', '.jpg'), image)
也感谢@Mark的建议。由于我必须转换大量图像,并且 openCV 似乎很容易处理我正在使用 openCV 的问题。
就像 Mark Setchell 建议的那样,pyvips
确实打开了 RLE 编码的 BMP,没有任何错误,这与我的测试中的 PIL 和 cv2 不同。我想用 PIL 打开 RLE 编码的 BMP,所以我也使用 numpy,但你不需要。
import os
import numpy as np
from PIL import Image
def get_old_img(input_image_path):
# pyvips acts as a substitute for PIL and cv2, because both of those can throw a warning in the terminal with RLE bmps.
pyvips_img = pyvips.Image.new_from_file(input_image_path, access='sequential')
np_img = vips2numpy(pyvips_img)
return Image.fromarray(np.uint8(np_img))
format_to_np_dtype = {
'uchar': np.uint8,
'char': np.int8,
'ushort': np.uint16,
'short': np.int16,
'uint': np.uint32,
'int': np.int32,
'float': np.float32,
'double': np.float64,
'complex': np.complex64,
'dpcomplex': np.complex128,
}
def vips2numpy(vi):
return np.ndarray(buffer=vi.write_to_memory(),
dtype=format_to_np_dtype[vi.format],
shape=[vi.height, vi.width, vi.bands])
get_old_img("input.bmp").show()
我不确定是否有其他人在尝试导入时通过 pip 安装它来让 pyvips 工作时遇到问题,因为它OSError: cannot load library 'C:devvipsvips-dev-8.6binlibgobject-2.0-0.dll'
我导致了错误,但您可以通过使用 pip 安装 pyvips 和从 https://github.com/libvips/libvips/releases 中解压缩最新版本的vips-dev-w64-all.zip
并在load_vips_end()
中更新vipshome
字符串来解决这个问题。
def load_vips_env():
vipshome = 'c:\vips-dev-8.10\bin'
os.environ['PATH'] = vipshome + ';' + os.environ['PATH']
load_vips_env()
import pyvips