自己用GDI+封装的BMP转PNG格式图片的dll(一)

这篇博客分享了作者使用GDI+库封装的一个DLL,该DLL能将BMP图片转换为PNG格式。提供了DLL源码,并链接到后续文章以供深入阅读。
摘要由CSDN通过智能技术生成
该DLL提供两个函数接口
1. 转换处理主函数
int BMP2PNG(char *file);
参数
file 
需要转换的文件,包括全路径名:如C:\ABC.bmp
返回值
成功返回0,不成功返回非零值
2. 信息返回函数
unsigned long GetInfoLog();
参数

返回值
返回错误代码
注释
当主函数返回值为1时,该函数返回的是GetLastError函数的错误代码
当主函数返回值为2时,该函数返回的是转换状态的错误代码
附加
转换状态的错误代码
typedef enum  {
  Ok                          = 0,
  GenericError                = 1,
  InvalidParameter            = 2,
  OutOfMemory                 = 3,
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要使用GDI将BMP图像发送到打印机打印,您需要执行以下步骤: 1. 打开打印机设备上下文(DC): ``` HDC hdcPrinter = CreateDC("WINSPOOL", printerName, NULL, NULL); ``` 其中,`printerName`是您要打印的打印机的名称。 2. 创建一个内存DC,并将BMP图像绘制到该DC上: ``` HDC hdcMem = CreateCompatibleDC(NULL); HBITMAP hBitmap = (HBITMAP)LoadImage(NULL, bmpFileName, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE); HBITMAP hOldBitmap = (HBITMAP)SelectObject(hdcMem, hBitmap); BITMAP bm; GetObject(hBitmap, sizeof(BITMAP), &bm); BitBlt(hdcMem, 0, 0, bm.bmWidth, bm.bmHeight, hdcMem, 0, 0, SRCCOPY); ``` 其中,`bmpFileName`是BMP图像文件的名称。 3. 获取打印机DC的打印机信息: ``` PRINTER_INFO_2 printerInfo; DWORD dwBytesNeeded; GetPrinter(hdcPrinter, 2, NULL, 0, &dwBytesNeeded); BYTE* pBuffer = new BYTE[dwBytesNeeded]; GetPrinter(hdcPrinter, 2, pBuffer, dwBytesNeeded, &dwBytesNeeded); memcpy(&printerInfo, pBuffer, sizeof(PRINTER_INFO_2)); delete[] pBuffer; ``` 4. 创建一个打印机DC,并将其与打印机连接: ``` HDC hdcPrint = CreateDC(NULL, printerInfo.pPrinterName, NULL, NULL); ``` 5. 设置打印机DC的打印机模式,并将内存DC中的BMP图像打印到打印机DC上: ``` DOCINFO di; ZeroMemory(&di, sizeof(DOCINFO)); di.cbSize = sizeof(DOCINFO); StartDoc(hdcPrint, &di); StartPage(hdcPrint); SetMapMode(hdcPrint, MM_ANISOTROPIC); SetViewportExtEx(hdcPrint, bm.bmWidth, bm.bmHeight, NULL); SetWindowExtEx(hdcPrint, bm.bmWidth, bm.bmHeight, NULL); BitBlt(hdcPrint, 0, 0, bm.bmWidth, bm.bmHeight, hdcMem, 0, 0, SRCCOPY); EndPage(hdcPrint); EndDoc(hdcPrint); ``` 6. 释放所有DC和位图: ``` SelectObject(hdcMem, hOldBitmap); DeleteDC(hdcMem); DeleteDC(hdcPrint); DeleteObject(hBitmap); ``` 完整的代码示例: ``` void PrintBmpOnPrinter(LPCTSTR printerName, LPCTSTR bmpFileName) { HDC hdcPrinter = CreateDC("WINSPOOL", printerName, NULL, NULL); HDC hdcMem = CreateCompatibleDC(NULL); HBITMAP hBitmap = (HBITMAP)LoadImage(NULL, bmpFileName, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE); HBITMAP hOldBitmap = (HBITMAP)SelectObject(hdcMem, hBitmap); BITMAP bm; GetObject(hBitmap, sizeof(BITMAP), &bm); BitBlt(hdcMem, 0, 0, bm.bmWidth, bm.bmHeight, hdcMem, 0, 0, SRCCOPY); PRINTER_INFO_2 printerInfo; DWORD dwBytesNeeded; GetPrinter(hdcPrinter, 2, NULL, 0, &dwBytesNeeded); BYTE* pBuffer = new BYTE[dwBytesNeeded]; GetPrinter(hdcPrinter, 2, pBuffer, dwBytesNeeded, &dwBytesNeeded); memcpy(&printerInfo, pBuffer, sizeof(PRINTER_INFO_2)); delete[] pBuffer; HDC hdcPrint = CreateDC(NULL, printerInfo.pPrinterName, NULL, NULL); DOCINFO di; ZeroMemory(&di, sizeof(DOCINFO)); di.cbSize = sizeof(DOCINFO); StartDoc(hdcPrint, &di); StartPage(hdcPrint); SetMapMode(hdcPrint, MM_ANISOTROPIC); SetViewportExtEx(hdcPrint, bm.bmWidth, bm.bmHeight, NULL); SetWindowExtEx(hdcPrint, bm.bmWidth, bm.bmHeight, NULL); BitBlt(hdcPrint, 0, 0, bm.bmWidth, bm.bmHeight, hdcMem, 0, 0, SRCCOPY); EndPage(hdcPrint); EndDoc(hdcPrint); SelectObject(hdcMem, hOldBitmap); DeleteDC(hdcMem); DeleteDC(hdcPrint); DeleteObject(hBitmap); } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值