python 处理有orientation的图片

本文介绍了一个Python函数,用于根据图片的EXIF信息修正图片的旋转问题。针对EXIF中的Orientation标签,特别是3,6,8三种情况,使用Image模块的transpose方法代替rotate来避免黑边问题,确保图片正确旋转。
摘要由CSDN通过智能技术生成
# The EXIF tag that holds orientation data.
EXIF_ORIENTATION_TAG = 274

# Obviously the only ones to process are 3, 6 and 8.
# All are documented here for thoroughness.
ORIENTATIONS = {
    1: ("Normal", 0),
    2: ("Mirrored left-to-right", 0),
    3: ("Rotated 180 degrees", 3),
    4: ("Mirrored top-to-bottom", 0),
    5: ("Mirrored along top-left diagonal", 0),
    6: ("Rotated 90 degrees", 4),
    7: ("Mirrored along top-right diagonal", 0),
    8: ("Rotated 270 degrees", 2)
}


def fix_orientation(img:Image):
    try:
        orientation = img._getexif()[EXIF_ORIENTATION_TAG]
    except (TypeError, AttributeError, KeyError):
        print('error')
        return img
    if orientation in [3, 6, 8]:
        degrees = ORIENTATIONS[orientation][1]
        img = img.transpose(degrees)
        return img
    else:
        return img

一般图片只会出现 3,6,8这三种情况;

本文参考:https://blog.csdn.net/ghost_blade/article/details/102919937;但是使用参考中的库会出现黑边问题,原因是该库使用了 img.rotate 方法,这里将其替换成 img.transpose,并做了参数处理,完美解决图片旋转问题。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
要用Python调用打印机打印图片,你可以使用 Python 的 Pillow 库来处理图片,使用 win32print 模块来调用打印机。具体步骤如下: 1. 首先,你需要安装 Pillow 库和 pywin32 模块。你可以在命令行中输入以下命令进行安装: ``` pip install Pillow pip install pywin32 ``` 2. 然后,你需要加载图片并调整大小。你可以使用 Pillow 库中的 Image.open() 函数来加载图片,然后使用 Image.resize() 函数来调整图片的大小。例如: ```python from PIL import Image # 加载图片并调整大小 img = Image.open('test.jpg') width, height = img.size ratio = min(1.0, 1024.0 / max(width, height)) img = img.resize((int(width * ratio), int(height * ratio))) ``` 这里使用了 Image.open() 函数来加载图片,然后使用 img.size 属性来获取图片的大小,计算出缩放比例,最后使用 Image.resize() 函数来调整图片的大小。 3. 接下来,你需要打开打印机并设置打印机属性。你可以使用 win32print 模块中的 win32print.OpenPrinter() 函数来打开打印机,并使用 win32print.SetPrinter() 函数来设置打印机属性。例如: ```python import win32print # 打开默认打印机 printer_name = win32print.GetDefaultPrinter() printer_handle = win32print.OpenPrinter(printer_name) # 设置打印机属性 properties = win32print.GetPrinter(printer_handle, 2) devmode = properties["pDevMode"] devmode.PaperSize = win32print.PAPER_A4 devmode.Orientation = win32print.ORIENTATION_PORTRAIT win32print.SetPrinter(printer_handle, 2, properties, 0) ``` 这里使用了 GetDefaultPrinter() 函数来获取默认打印机的名称,然后使用 OpenPrinter() 函数来打开打印机,使用 GetPrinter() 函数来获取打印机属性,然后修改属性中的纸张大小和方向,最后使用 SetPrinter() 函数来设置打印机属性。 4. 最后,你需要使用 win32print 模块中的 win32print.StartDocPrinter() 和 win32print.StartPagePrinter() 函数来开始打印任务,并使用 win32print.WritePrinter() 函数来写入打印数据。例如: ```python import win32ui # 开始打印任务 win32print.StartDocPrinter(printer_handle, 1, ("test.jpg", None, "RAW")) win32print.StartPagePrinter(printer_handle) # 写入打印数据 hDC = win32ui.CreateDC() hDC.CreatePrinterDC(printer_name) hDC.StartDoc("test.jpg") hDC.StartPage() bmp = win32ui.CreateBitmap() bmp.CreateCompatibleBitmap(hDC, img.width, img.height) bmp.GetBitmapBitsBuffer(bmp.GetBitmapBits(), 24) bmp_bits = bmp.GetBitmapBitsBuffer() bmp_bits[:] = img.tobytes() bmp.SetBitmapBits(bmp_bits) hDC.SelectObject(bmp) hDC.BitBlt((0, 0), (img.width, img.height), bmp, (0, 0), win32con.SRCCOPY) hDC.EndPage() hDC.EndDoc() hDC.DeleteDC() win32print.EndPagePrinter(printer_handle) win32print.EndDocPrinter(printer_handle) ``` 这里使用了 StartDocPrinter() 函数来开始打印任务,使用 StartPagePrinter() 函数来开始打印页,然后使用 CreateDC() 函数来创建设备上下文,使用 CreateCompatibleBitmap() 函数来创建位图,使用 GetBitmapBitsBuffer() 函数来获取位图数据,使用 tobytes() 函数来获取图片数据,最后使用 BitBlt() 函数来将图片数据写入打印机缓冲区。 总的来说,以上就是用 Python 调用打印机打印图片的基本步骤。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值