You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python:如何在原始BMP图像上正确绘制矩形而非灰度图?

嘿,这个问题我之前踩过坑!大概率是你在处理过程中不小心把原始BMP转成灰度图了,或者绘图操作是在灰度副本上进行的,最后保存的自然就是带矩形的灰度图啦。下面给你两种常用图像处理库的解决方案,直接在原始BMP上绘制矩形:

方法一:使用PIL(Pillow)库

这是Python里处理图像比较直观的库,步骤很简单:

  • 加载原始BMP时不要做灰度转换,Image.open()会自动保留原始图像的通道数(比如彩色BMP是3通道RGB)
  • 创建绘图对象直接操作原始图像
  • 绘制矩形后保存即可

示例代码:

from PIL import Image, ImageDraw

# 加载原始BMP图像,保留原始通道
img = Image.open("original_image.bmp")

# 创建绘图对象,直接在原始图像上操作
draw = ImageDraw.Draw(img)

# 定义矩形坐标(左上x, 左上y, 右下x, 右下y)和RGB颜色
rect_coords = (50, 50, 200, 200)
rect_color = (255, 0, 0)  # 红色

# 绘制矩形,可通过width参数设置线条粗细
draw.rectangle(rect_coords, outline=rect_color, width=3)

# 保存修改后的图像
img.save("image_with_rect.bmp")
方法二:使用OpenCV库

如果你习惯用OpenCV,注意它的颜色格式是BGR,而且加载时要指定参数避免自动转灰度:

  • 用cv2.IMREAD_UNCHANGED参数加载图像,确保保留所有原始通道数据
  • 直接在原始图像数组上绘制矩形
  • 保存修改后的图像

示例代码:

import cv2

# 加载原始BMP,IMREAD_UNCHANGED确保不丢失原始通道信息
img = cv2.imread("original_image.bmp", cv2.IMREAD_UNCHANGED)

# 定义矩形的左上/右下坐标、BGR颜色和线条粗细
top_left = (50, 50)
bottom_right = (200, 200)
color = (0, 0, 255)  # 红色(OpenCV采用BGR顺序)
thickness = 3

# 在原始图像上绘制矩形
cv2.rectangle(img, top_left, bottom_right, color, thickness)

# 保存图像
cv2.imwrite("image_with_rect.bmp", img)

关键注意点

  • 检查你之前的代码,是不是有类似convert("L")(PIL)或者cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)的灰度转换操作,如果有,要么去掉,要么确保绘图操作是在原始图像副本上进行,而不是灰度图
  • 如果你的BMP是带Alpha通道的4通道图像,只需要把颜色参数改成对应通道格式(比如PIL用(255,0,0,255),OpenCV用(0,0,255,255))即可

内容的提问来源于stack exchange,提问作者X. Gu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 06:42:48