首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >不支持BMP压缩- BMP到JPEG - PIL - Python

不支持BMP压缩- BMP到JPEG - PIL - Python
EN

Stack Overflow用户
提问于 2018-09-19 05:08:21
回答 3查看 3.5K关注 0票数 1

我正试图使用下面的代码将bmp图像转换为jpeg。

代码语言:javascript
复制
from PIL import Image
img = Image.open('/Desktop/xyz.bmp')
new_img = img.resize( (256, 256) )
new_img.save( '/Desktop/abc.png', 'png')

当执行得到错误时,

代码语言:javascript
复制
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:\Python34\lib\site-packages\PIL\Image.py", line 2609, in open
    im = _open_core(fp, filename, prefix)   File "C:\Python34\lib\site-packages\PIL\Image.py", line 2599, in _open_core
    im = factory(fp, filename)   File "C:\Python34\lib\site-packages\PIL\ImageFile.py", line 102, in
__init__
    self._open()   File "C:\Python34\lib\site-packages\PIL\BmpImagePlugin.py", line 201, in
_open
    self._bitmap(offset=offset)   File "C:\Python34\lib\site-packages\PIL\BmpImagePlugin.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

有人能引导我克服这个错误吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-09-20 01:29:34

在尝试了许多可能的方法之后,我找到了openCV库的解决方案。这不会抛出任何压缩错误和处理转换的魅力。

代码语言:javascript
复制
import cv2
image = cv2.imread(img)
cv2.imwrite(imag_name.replace('.bmp', '.jpg'), image)

也感谢马克的建议。由于我必须转换大量的图像和openCV似乎很小,以解决问题,我将与openCV。

票数 2
EN

Stack Overflow用户

发布于 2018-09-19 07:26:57

这不是你自己的错。该图像是尴尬微软BMP V3格式,我相信,RLE压缩,我不相信枕头能够处理这一点。

您可以使用ImageMagick来重写映像,而不需要像这样在终端中进行压缩,然后代码就可以正常工作了:

代码语言:javascript
复制
convert image.bmp -compress none image.bmp

但是,如果您正在这样做,您也可以使用ImageMagick来制作PNG:

代码语言:javascript
复制
convert image.bmp result.png

作为另一种选择,如果您想使用Python,您可以尝试其他库,比如pyvips --我将尝试并返回报告。

票数 2
EN

Stack Overflow用户

发布于 2020-12-29 23:37:28

正如Mark所建议的,pyvips确实打开了RLE编码的BMP,而不是在我的测试中使用PIL和cv2。我想用PIL打开RLE编码的BMP,所以我也使用numpy,但是您不需要使用。

代码语言:javascript
复制
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()

我不确定是否有其他人在试图导入pyvip时通过pip安装pyvips会出现问题,因为它会为我造成错误OSError: cannot load library 'C:\dev\vips\vips-dev-8.6\bin\libgobject-2.0-0.dll',但是您可以通过来修复这个问题--使用pip安装pyvip的,以及从https://github.com/libvips/libvips/releases解压缩最新版本的vips-dev-w64-all.zip,以及在load_vips_end()中更新vipshome字符串。

代码语言:javascript
复制
def load_vips_env():
    vipshome = 'c:\\vips-dev-8.10\\bin'
    os.environ['PATH'] = vipshome + ';' + os.environ['PATH']

load_vips_env()

import pyvips
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52398468

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档