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 指向的位图。 BITMAPINFOHEADER 结构在Microsoft Windows SDK文档中介绍。
pColorTable
调用方提供的指向颜色表的指针。 仅当输出格式为每像素 8 位时,才使用此参数。 有关更多信息,请参见下面的“备注”部分。
解释位图时,必须检查颜色表。 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 属性的讨论。
返回值
方法必须返回以下值之一。
返回代码 | 说明 |
---|---|
|
操作成功。 |
|
此操作失败。 |
|
该方法未实现。 |
源位图特征
目标位图特征
注解
方法 IPrintOemUni::ImageProcessing
用于在图像位图发送到打印后台处理程序之前对其进行修改。 其用途是为 Unidrv 不支持的颜色模式和半调方法提供自定义支持。 将位图发送到打印后台处理程序 (而不是将其发送回 Unidrv) 的打印机驱动程序必须在打印机的 GPD 文件中将 *DevBPP 和 *DevNumOfPlanes 属性设置为零。
如果实现了 方法,并且当前颜色格式的 GPD 文件条目包含 *IPCallbackID 属性,则每次位图可用时,Unidrv 都会调用该方法。 调用是在 GDI 呈现位图之后进行的,位图随后会发送到后台处理程序。 (有关 *IPCallbackID 属性的信息,请参阅 ColorMode Feature 的选项属性。)
如果 由 dwCallbackID 指定的当前颜色模式是 Unidrv 支持的颜色模式,则 IPrintOemUni::ImageProcessing
该方法应对收到的位图执行半调运算,并将其返回到 Unidrv 进行假脱机。 如果当前颜色模式是 Unidrv 不支持的颜色模式,则 该方法必须执行半调运算,然后对位图进行假脱机处理。
如果方法仅执行半顿操作,则必须执行以下操作:
- 根据 IPPARAMS 结构的 pHalftoneOption 成员指示,对数据执行半调运算。
- 通过将修改后的图像数据放置在缓冲区中并提供缓冲区的地址作为方法的返回值,将修改后的图像数据返回到 Unidrv。 返回的缓冲区可以是 pSrcBitmap 指向的缓冲区,也可以是本地分配的缓冲区。
若要处理自定义颜色格式设置, IPrintOemUni::ImageProcessing
方法必须执行以下操作:
- 将 pSrcBitmap 和 pBitmapInfoHeader 参数值描述的 DIB 数据转换为 dwCallbackID 指示的颜色格式。
- 根据 IPPARAMS 结构的 pHalftoneOption 成员指示,对数据执行半调运算。
- 通过调用 IPrintOemDriverUni::D rvWriteSpoolBuf 方法将数据发送到打印后台处理程序。
- 通过对 IPrintOemDriverUni::D rvXMoveTo 和 IPrintOemDriverUni::D rvYMoveTo 方法进行适当调用来修改打印机的光标位置。
dwCallbackID 参数指示应执行的颜色格式设置类型(如果有)。 在打印机的 GPD 文件中,ColorMode 功能的每个选项条目都描述了一种颜色格式。 如果格式需要方法 IPrintOemUni::ImageProcessing
进行处理,则其选项条目必须包含 *IPCallbackID 属性。 当 Unidrv 调用 方法时 IPrintOemUni::ImageProcessing
,它将提供与 ColorMode 功能的当前所选选项关联的属性值。 此值是 dwCallbackID 参数的值。
IPrintOemUni::ImageProcessing
无论该方法是执行颜色格式设置操作和假脱机图像数据,还是只是执行半调操作并将已处理的位图返回到 Unidrv,如果它为目标位图或其他目的分配了大量内存,则它都应导出 IPrintOemUni::MemoryUsage 方法。 否则,系统性能可能会下降。
如果实现了 方法,则会对页面上的每个光栅区域调用该方法。 但是,如果区域为空,则 IPPARAMS 结构的 bBlankBand 成员将设置为 TRUE,这表示块为空且数据无效。 由于一个带可以分为空白和非空区域的交替块来优化性能,因此块大小并不总是与带大小相对应。
pSrcBitmap 和 pBitmapInfoHeader 描述的源位图具有以下特征:
- DIB 内容按自上而下的顺序排序和未压缩。
- 数据格式是 处理颜色格式中列出的格式。
- 如果格式需要颜色表,则 pColorTable 会指向该表。
- 颜色数据采用PRIMARY_ORDER_CBA格式,如 GDIINFO 结构的 ulPrimaryOrder 成员的说明中所述。 换言之,如果颜色格式为 RGB 或 CMY,则最低有效 n 位必须包含蓝色或黄色值,接下来 的 n 位必须包含绿色或洋红色值,接下来 的 n 位必须包含红色或青色值。 未使用的位位于最有效位置。 如果格式使用每像素 4 位,则 n 为 1。 对于每像素 24 位, n 为 8,如下图所示。 对于 CMYK,第四组 n 位包含黑色。
上图描绘了两个像素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。
要求
要求 | 值 |
---|---|
目标平台 | 桌面 |
标头 | prcomoem.h (包括 Prcomoem.h) |