我有PIL图像,我正试图转换成灰度HBitmap在ctypes。我对ctypes、C或处理HBitmap知之甚少。我拼凑了各种来源的代码,比如
这就是我目前所拥有的。首先,我初始化了所需的头:
import ctypes
from ctypes import wintypes
class BITMAPINFOHEADER(ctypes.Structure):
_fields_ = [
('biSize', wintypes.DWORD),
('biWidth', wintypes.LONG),
('biHeight', wintypes.LONG),
('biPlanes', wintypes.WORD),
('biBitCount', wintypes.WORD),
('biCompression', wintypes.DWORD),
('biSizeImage', wintypes.DWORD),
('biXPelsPerMeter', wintypes.LONG),
('biYPelsPerMeter', wintypes.LONG),
('biClrUsed', wintypes.DWORD),
('biClrImportant', wintypes.DWORD),
]
class RGBQUAD(ctypes.Structure):
_fields_ = [
('rgbRed', ctypes.c_byte),
('rgbGreen', ctypes.c_byte),
('rgbBlue', ctypes.c_byte),
('rgbReserved', ctypes.c_byte),
]
class BITMAPINFO(ctypes.Structure):
_fields_ = [
('bmiHeader', BITMAPINFOHEADER),
('bmiColors', ctypes.POINTER(RGBQUAD))
]
w,h=image.size
bmi = BITMAPINFO()
bmi.bmiHeader.biSize = ctypes.sizeof(BITMAPINFOHEADER)
bmi.bmiHeader.biWidth = w
bmi.bmiHeader.biHeight = h
bmi.bmiHeader.biPlanes = 1
bmi.bmiHeader.biBitCount = 8
bmi.bmiHeader.biCompression = 0
bmi.bmiHeader.biSizeImage = 0
elems=(RGBQUAD*256)()
bmi.bmiColors=ctypes.cast(elems,ctypes.POINTER(RGBQUAD))
for i in range(256):
bmi.bmiColors[i].rgbRed=i
bmi.bmiColors[i].rgbGreen=i
bmi.bmiColors[i].rgbBlue=i
bmi.bmiColors[i].rgbReserved=0
然后,我创建了我的hbitmap:
^{pr2}$我正在通过Python中不同的代码行将这些hbitmap上传到某个投影仪上。我创建的hbitmap似乎部分起作用了,因为我可以成功地定义要投影的空间模式。我的问题是得到分级像素强度。具体地说,如果我将值设置为0-127,像素将显示为黑色;如果将值设置为128-255,则像素显示为白色,没有渐变。这些让我怀疑是设置RGB调色板的问题。在
我已经直接将PIL图像文件保存到.bmp中,并验证它们是否具有分级强度值。如果我有办法把结尾的HBITMAP输出保存到.bmp中,也许会更容易解决问题,但在这个阶段,我只是通过直接上传到投影仪来检查这些HBITMAP。在
我还尝试过修改定义调色板的代码,例如:
bmi.bmiColors[i].rgbRed=9999
或者:
bmi.bmiColors[i].rgbsRed=i
但这些似乎对我的投影仪的输出没有任何影响。我仍然可以准确地设置图像,只是没有分级像素强度。在
目前没有回答
相关问题 更多 >
编程相关推荐