- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我一直在研究创建 PARRGB32 位图。这似乎是生成完全适用于 XP 后菜单项的图像所必需的。
这个示例 http://msdn.microsoft.com/en-us/library/bb757020.aspx?s=6 非常有趣但相当复杂,因为我以前很少使用 OLE 接口(interface)。然而,在仔细研究了使用 WIC 和 OLE 的那段代码之后,我想我明白了它是如何工作的。让我感到困惑的一件事是用户“David Hellerman”的评论。总而言之,他说这个示例功能并不完整。它不考虑源图标中任何潜在的 alpha 信息 - 如果有 alpha 数据,则必须在扫描 ppvBuffer 变量时逐个像素地进行预乘。
我的问题分为两部分。在使用 WIC 而不是 GDI 时如何检测图标中是否存在 alpha 数据?如果确实存在,我该如何将其预乘到像素中?
最佳答案
从技术上讲,示例代码是错误的,因为它在调用 CopyPixels 时没有考虑或检查 IWICBitmap 对象的格式。创建位图时,CreateBitmapFromHICON 可能总是使用特定格式(该示例表明它是 32 位 PBGRA,但评论表明它是 BGRA),但 MSDN 没有记录,依赖它至少是错误的形式。 WIC 支持多种像素格式,并非所有像素格式都是 32 位或 RGB。
您可以使用 WICConvertBitmapSource 函数 ( http://msdn.microsoft.com/en-us/library/windows/desktop/ee719819(v=vs.85).aspx ) 将数据转换为特定的已知格式,在您的情况下,您需要 GUID_WICPixelFormat32bppPBGRA(您可能习惯于看到该格式写为 PARRGB,但 WIC 使用一种基于字节数组而不是 32 位整数中组件顺序的奇怪合理的命名约定)。如果转换意味着预乘数据,它会这样做,但关键是如果你想要一种特定的格式,你不需要担心它是如何到达那里的。您可以按照 MSDN 示例使用其 IWICBitmap 的相同方式使用生成的 IWICBitmapSource。
您可以使用 IWICBitmapSource::GetPixelFormat ( http://msdn.microsoft.com/en-us/library/windows/desktop/ee690181(v=vs.85).aspx ) 来确定图像的像素格式。但是,通常无法知道 alpha 数据(如果格式有 alpha 数据)是否被预乘,您只需要识别格式 GUID。当我想专门处理不止一种格式时,我通常使用 GetPixelFormat,但对于我不处理的格式,我仍然会使用 WICConvertBitmapSource。
编辑:我漏掉了你问题的一部分。无法根据 IWICBitmap 检测图标最初是否具有 alpha channel ,因为 WIC 在所有情况下都会从图标创建带有 alpha channel 的位图。这也不是必需的,因为在这种情况下预乘 alpha 是空操作。
关于windows - WIC 'Copy Pixels' 调用后预乘像素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27239343/
我正在尝试制作一个简单的视频播放器,例如使用 Direct2D 和 WIC 位图的程序。 它需要快速和 CPU 经济地绘制(拉伸(stretch))YUV 像素格式帧数据。 我已经用 GDI 测试过了
我正在使用 Windows 成像组件库对大量图像进行编码。理想情况下,我想使用某些属性设置一次编码器,然后为我的所有图像重新使用该编码器。然而,在我看到的所有示例中,编码器似乎是为单个图像创建的。 我
我的 MFC 程序中有一个包含图像的 WICBitmap。有什么方法可以将此位图绘制到设备环境中吗? void DrawBitmap(IWICBitmapSource source, HDC targ
这可能是一个相当简单的问题,我遗漏了一些东西。我正在尝试使用 wic作为用于布置引导分区的自定义脚本的替代。该设备是一个 IMX6,并在 0x400 处写入了 uboot,以及一个用于加载/boot
我正在使用 WIC (Windows Imaging Component) 来解码图像文件并访问像素数据。我试图找出像素顺序(即自下而上或自上而下)。 我用 IWICImagingFactory::C
我有一个 BYTE 数组形式的图像(RGB 格式),我需要对其进行编码。我做了,但是颜色变了。 /*Create stream and initialized*/ hr = piFactory->Cr
场景:加载 TIFF 图像并提取 tiff 图像的帧并将其保存在本地。将提取的帧组合到输出 TIFF 图像中。当我尝试合并帧时,输出的 tiff 图像的大小急剧增加。例如,如果我的输入大小为 40 M
我一直在研究创建 PARRGB32 位图。这似乎是生成完全适用于 XP 后菜单项的图像所必需的。 这个示例 http://msdn.microsoft.com/en-us/library/bb7570
Windows Imaging Component 用于解码 heif 图像。但是,成功解码图像需要来自 Microsoft 商店的额外应用程序(heif 图像扩展、hevc 视频扩展)。 没有它们,
我正在寻找最快的方法来创建按比例缩小的位图,以尊重 EXIF 方向标签 引用:https://weblogs.asp.net/bleroy/the-fastest-way-to-resize-imag
我有一个缩略图生成例程,是我使用 WIC 为 .NET 应用程序创建的。它在过去一年中一直运行良好,但我们刚刚迁移到新服务器。 旧服务器是 W2k8 R2 Enterprise SP1新服务器是W2k
我有一个使用 Windows Imaging Component API 的简单编码/解码应用程序。我遇到的问题是,当我使用 JPEGXR 或 BMP 格式时,一切正常。但是,当我使用 JPEG 编解
我在将位图保存到文件时遇到问题。我正在使用 How to save ID2D1Bitmap to PNG file作为引用,但我有一个与其中发布的错误不同的错误。 我收到错误 0x88990015 H
我使用 WIC 制作了一个编码器。然后我尝试在最耗时的部分使用线程。这是 /*Encodes a bitmap source*/ hr = piBitmapFrame->WriteSource(
我这里有个小问题。我正在使用以下代码片段调整图像大小: public static BitmapFrame FastResize(BitmapFrame image, int width, int h
如何在64位XP机器上查看是否安装了windows镜像组件。 最佳答案 检查 C:\Windows\System32\WindowsCodecs.dll 是否存在 关于windows - 检查是否安装
有谁知道一些示例代码,显示 Delphi 2010 如何使用其新的 WIC COM 接口(interface)读取 RAW 文件? 我想读取佳能 RAW 图像,然后访问特定像素... 最佳答案 这是最
我需要在Delphi 2007中读取一些大约1.7mb的图片并将其从jpg转换为bmp。 有些图片被剪切、灰度化或转换后效果最差。 我进行了搜索,但没有找到在 delphi 2007 中添加像 TWi
我有以下代码可以使用默认选项从 IWICBitmapSource 创建一个 jpg 文件: function SaveWICBitmapToJpgFile(WICFactory: IWICImagin
我正在使用 WIC 加载图像,然后我希望能够获取每个像素的 RGB 值。我已经使用 getDataPointer() 来创建一个 byte 缓冲区(我将其转换为一个 COLORREF 数组)但是在这之
我是一名优秀的程序员,十分优秀!