首页 > 解决方案 > 将用 Magick++ 加载的 1 位图像转换为 HBITMAP

问题描述

我想知道是否可以将我用 Magick++ ( Magick::Image image; image.read(path);) 加载的 1 位图像转换为深度等于 1 的 HBITMAP(类似于你通过这样的调用得到的结果CreateBitmap(width, height, 1, depth, data);

天真CreateBitmap(width, height, 1, depth, image.getConstPixels(0, 0, width, height));的尝试当然没有奏效——ImageMagick 数据显然是以不同的方式存储的。我能够使用BITMAP容器(不是完整代码)正确复制该数据:

bitmap.bmWidth = image->image()->columns;
bitmap.bmHeight = image->image()->rows;
bitmap.bmWidthBytes = 4 * bitmap.bmWidth;
bitmap.bmPlanes = 1;
bitmap.bmBitsPixel = 32;
...
for (y = 0; y < (ssize_t)image->image()->rows; y++) {
    p = GetVirtualPixels(image->image(), 0, y, image->image()->columns, 1, exception);
    if (!p) break;

    for (x = 0; x < (ssize_t)image->image()->columns; x++)
    {
        q->rgbRed = ScaleQuantumToChar(GetPixelRed(image->image(), p));
        q->rgbGreen = ScaleQuantumToChar(GetPixelGreen(image->image(), p));
        q->rgbBlue = ScaleQuantumToChar(GetPixelBlue(image->image(), p));
        q->rgbReserved = 0;

        p += GetPixelChannels(image->image());
        q++;
    }
}

当目标位图是 32 位图像时,它可以工作。但是假设目标图像是 1 位的。ImageMagick 中是否有一个函数可以让我以一种可以轻松转换为 1 位的方式提取数据?我找不到另一个类似的功能ScaleQuantumToChar。ImageMagick 支持吗?

标签: c++winapiimagemagickmagick++

解决方案


推荐阅读