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 指向的位图。 位图INFOHEADER 结构在Microsoft Windows SDK文档中介绍。

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 Feature.) 选项属性

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

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

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

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

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

dwCallbackID 参数指示应执行的颜色格式类型(如果有)。 在打印机的 GPD 文件中,ColorMode 功能的每个 *Option 条目描述颜色格式。 如果格式需要方法 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,如下图所示。 对于 CYMK,第四组 n 位包含黑色。

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

要求

   
目标平台 桌面
Header prcomoem.h (包括 Prcomoem.h)

请参阅

HT_Get8BPPMaskPalette

IPrintOemUni

IPrintOemUni::FilterGraphics