IPrintOemUni::ImageProcessing 方法(prcomoem.h)

IPrintOemUni::ImageProcessing 方法可与 Unidrv 支持的打印机一起使用,以修改图像位图数据,以便执行颜色格式设置或半调。 该方法可以将修改后的位图返回到 Unidrv,或将其直接发送到打印后台处理程序。

语法

HRESULT ImageProcessing(
        PDEVOBJ           pdevobj,
        PBYTE             pSrcBitmap,
        PBITMAPINFOHEADER pBitmapInfoHeader,
        PBYTE             pColorTable,
        DWORD             dwCallbackID,
        PIPPARAMS         pIPParams,
  [out] OUT PBYTE         *ppbResult
);

参数

pdevobj

调用方提供的指向 DEVOBJ 结构的指针。

pSrcBitmap

调用方提供的指向输入 DIB的指针。

pBitmapInfoHeader

调用方提供的指向 BITMAPINFOHEADER 结构的指针,该结构描述由 pSrcBitmap指向的位图。 Microsoft Windows SDK 文档中介绍了 BITMAPINFOHEADER 结构。

pColorTable

调用方提供的指向颜色表的指针。 仅当输出格式为每像素八位时,才使用此参数。 有关详细信息,请参阅以下“备注”部分。

解释位图时,必须检查颜色表。 Unidrv 可以修改位图中的颜色,但它也会在颜色表中做出相应的调整,从而导致无净变化。 但是,如果忽略颜色表更改并仅检查位图,则图像可能无法正确打印。 有关示例,请参阅 HT_Get8BPPMaskPalette中的 pPaletteEntry 参数的讨论。

dwCallbackID

分配给 *ColorMode 功能的当前选定选项的 IPCallbackID 属性的调用方提供的值。 有关详细信息,请参阅以下“备注”部分。

pIPParams

调用方提供的指向 IPPARAMS 结构的指针。

[out] ppbResult

指向包含缓冲区地址的内存位置的指针。 缓冲区的内容取决于应发送转换的 DIB 的位置。

如果此方法打算将转换的 DIB 发送回 Unidrv 并成功转换,则应将 *ppbResult 设置为包含转换的 DIB 的缓冲区的地址,并且应返回S_OK。 如果转换失败,该方法应将 *ppbResult 设置为 NULL,并应返回E_FAIL。

如果此方法打算将转换的 DIB 发送到后台处理程序并成功转换,则该方法应将 *ppbResult 设置为 TRUE,并且应返回S_OK。 如果转换失败,该方法应将 *ppbResult 设置为 FALSE,并应返回E_FAIL。 有关详细信息,请参阅“备注”部分中的 *DevBPP 和 *DevNumOfPlanes 属性的讨论。

返回值

该方法必须返回以下值之一。

返回代码 描述
S_OK
作成功。
E_FAIL
作失败。
E_NOTIMPL
未实现该方法。
 

源位图特征

目标位图特征

言论

IPrintOemUni::ImageProcessing 方法用于在将图像位图发送到打印后台处理程序之前修改图像位图。 其用途是为 Unidrv 不支持的颜色模式和半调方法提供自定义支持。 将位图发送到打印后台处理程序的打印机驱动程序(而不是将其发送回 Unidrv)必须将打印机的 GPD 文件中的 *DevBPP 和 *DevNumOfPlanes 属性设置为零。

如果实现该方法,并且当前颜色格式的 GPD 文件条目包含 *IPCallbackID 属性,则 Unidrv 每次提供位图时都会调用该方法。 在 GDI 呈现位图之后进行调用,然后将该位图发送到后台处理程序。 (有关 *IPCallbackID 属性的信息,请参阅 colorMode 功能 选项属性。

如果由 dwCallbackID指定的当前颜色模式是 Unidrv 支持的模式,则 IPrintOemUni::ImageProcessing 方法应对收到的位图执行半调运算,并将其返回到 Unidrv 进行后台处理。 如果当前颜色模式是 Unidrv 不支持的模式,则该方法必须执行半调运算,然后后台处理位图。

如果该方法只执行半调运算,则必须执行以下作:

  • 根据 IPPARAMS 结构的 pHalftoneOption 成员对数据执行半顿作。
  • 通过将修改后的图像数据放置在缓冲区中并将缓冲区的地址作为方法的返回值提供,将修改后的图像数据返回到 Unidrv。 返回的缓冲区可以是 pSrcBitmap指向的缓冲区,也可以是本地分配的缓冲区。
有关在 Unidrv 中自定义半顿作的详细信息,请参阅 自定义半顿

若要处理自定义颜色格式设置,IPrintOemUni::ImageProcessing 方法必须执行以下作:

有关在 Unidrv 中自定义颜色格式作的详细信息,请参阅 自定义颜色格式

dwCallbackID 参数指示应执行的颜色格式类型(如果有)。 在打印机的 GPD 文件中,ColorMode 功能的每个 *选项条目描述颜色格式。 如果格式需要 IPrintOemUni::ImageProcessing 方法进行处理,则其 *Option 条目必须包含 *IPCallbackID 属性。 当 Unidrv 调用 IPrintOemUni::ImageProcessing 方法时,它将提供与 ColorMode 功能当前所选选项关联的属性值。 此值是 dwCallbackID 参数的值。

无论 IPrintOemUni::ImageProcessing 方法是执行颜色格式设置作和后台处理图像数据,还是只执行半调运算并将处理的位图返回到 Unidrv,如果为目标位图或其他目的分配大量内存,则应导出 IPrintOemUni::MemoryUsage 方法。 否则,系统性能可能会降低。

如果实现了该方法,则会针对页面上的每个光栅区域调用该方法。 但是,如果区域为空,则 IPPARAMS 结构的 bBlankBand 成员设置为 TRUE,这表示块为空,数据无效。 由于条带可以分解为空白和非空白区域的交替块以优化性能,因此块大小并不总是对应于带大小。

pSrcBitmappBitmapInfoHeader 描述的源位图具有以下特征:

  • DIB 内容是自上而下排序和未压缩的。
  • 数据格式是 处理颜色格式中列出的格式。
  • 如果格式需要颜色表,pColorTable指向该表。
  • 颜色数据采用PRIMARY_ORDER_CBA格式,如 GDIINFO 结构 ulPrimaryOrder 成员的说明中所述。 换而言之,如果颜色格式为 RGB 或 CMY,则最不重要的 n 位必须包含蓝色或黄色值,则下一 n 位必须包含绿色或洋红色值,下一个 n 位必须包含红色或蓝绿色值。 未使用的位处于最重要的位置。 如果格式每像素使用 4 位,则 n 为 1。 对于每个像素 24 位,n 为 8,如下图所示。 对于 CMYK,第四组 n 位包含黑色。

PRIMARY_ORDER_CBA 格式
上图描绘了两个像素PRIMARY_ORDER_CBA格式的颜色数据,每个像素有 24 位的颜色数据。 从低内存地址移动到高内存地址,有 8 位蓝色数据,然后是 8 位绿色数据,然后是 8 位红色数据,之后模式会重复。 这也称为 BGR 设备输出顺序。
对于半调运算,其中已处理的位图返回到 Unidrv,返回的位图必须具有以下特征:
  • DIB 内容必须自上而下排序和解压缩。
  • 数据格式必须是 处理颜色格式中列出的格式,并且它必须与 *DevBPP 和 *DevNumOfPlanes 属性兼容,该属性由 dwCallbackID标识。 (有关这些属性的信息,请参阅 colorMode 功能 选项属性。
  • 如果格式需要颜色表,则必须创建该表,并且必须在 pColorTable 中返回其地址。
  • 颜色数据必须以PRIMARY_ORDER_CBA格式返回,如源位图所述。
  • pBitmapInfoHeader 指定的 BITMAPINFOHEADER 结构必须同时描述输入和输出位图。 IPrintOemUni::ImageProcessing 方法不得更改结构的内容。
IPrintOemUni::ImageProcessing 方法是可选的。 如果呈现插件实现此方法,则插件的 IPrintOemUni::GetImplementedMethod 方法在收到“ImageProcessing”作为输入时必须返回S_OK。

要求

要求 价值
目标平台 桌面
标头 prcomoem.h (include Prcomoem.h)

另请参阅

HT_Get8BPPMaskPalette

IPrintOemUni

IPrintOemUni::FilterGraphics