带有python ctypes的灰度hbitmap

2024-10-01 02:30:59 发布

您现在位置:Python中文网/ 问答频道 /正文

我有PIL图像,我正试图转换成灰度HBitmap在ctypes。我对ctypes、C或处理HBitmap知之甚少。我拼凑了各种来源的代码,比如

  1. Drawing on 8bpp grayscale bitmap (unmanaged C++)
  2. http://d.hatena.ne.jp/chrono-meter/20090905/p3

这就是我目前所拥有的。首先,我初始化了所需的头:

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

但这些似乎对我的投影仪的输出没有任何影响。我仍然可以准确地设置图像,只是没有分级像素强度。在


Tags: 代码fields像素bytectypesstructurelongclass