MFC BMP设置Bitmap的分辨率DPI为600点 gdiplus 生成标签

该博客介绍了如何使用GDI+在Windows环境下设置和检查BMP图像的分辨率,并详细展示了生成条码标签图片的过程,包括设置条码的格式、画条码到图片以及保存为特定分辨率的BMP文件。

MFC设置Bitmap 的分辨率DPI  (打印机一般是600点) 

检索编码器的类标识符 - Win32 apps | Microsoft Docs

  • image/bmp
  • image/jpeg
  • image/gif
  • image/tiff
  • image/png
#include <atlbase.h> 


using namespace Gdiplus;
int GetEncoderClsid(const WCHAR* format, CLSID* pClsid)
{
	UINT  num = 0;          // number of image encoders
	UINT  size = 0;         // size of the image encoder array in bytes

	ImageCodecInfo* pImageCodecInfo = NULL;

	GetImageEncodersSize(&num, &size);
	if (size == 0)
		return -1;  // Failure

	pImageCodecInfo = (ImageCodecInfo*)(malloc(size));
	if (pImageCodecInfo == NULL)
		return -1;  // Failure

	GetImageEncoders(num, size, pImageCodecInfo);

	for (UINT j = 0; j < num; ++j)
	{
		if (wcscmp(pImageCodecInfo[j].MimeType, format) == 0)
		{
			*pClsid = pImageCodecInfo[j].Clsid;
			free(pImageCodecInfo);
			return j;  // Success
		}
	}

	free(pImageCodecInfo);
	return -1;  // Failure
}
BOOL checkBMPResolution(LPCTSTR  fileName, float dpi)
{
	// Initialize GDI+.
	GdiplusStartupInput gdiplusStartupInput;
	ULONG_PTR gdiplusToken;
	GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);


	USES_CONVERSION;
	Gdiplus::Bitmap* pBitmap = new Gdiplus::Bitmap(T2W(fileName));
	if (pBitmap == NULL || pBitmap->GetLastStatus() != Gdiplus::Ok) { logger.ERROR_F(__FUNCTION__+to_string(__LINE__)+"出错:" + to_string(pBitmap->GetLastStatus()));  delete pBitmap;	return FALSE; }

	if (pBitmap->GetHorizontalResolution() != dpi || pBitmap->GetVerticalResolution() != dpi)
	{
		logger.ERROR_F("水平分辨率" + to_string(pBitmap->GetHorizontalResolution()) + "或垂直分辨率" + to_string(pBitmap->GetVerticalResolution()) + " 错误,应该为" + to_string(dpi));
		delete pBitmap;
		return FALSE;
	}
	delete pBitmap;
	return TRUE;
}
BOOL setBMPResolution(LPCTSTR  fileName, float dpi)
{
	LPCTSTR outFileName = "temp.bmp";
	// Initialize GDI+.
	GdiplusStartupInput gdiplusStartupInput;
	ULONG_PTR gdiplusToken;
	GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);


	USES_CONVERSION;
	Gdiplus::Bitmap* pBitmap = new Gdiplus::Bitmap(T2W(fileName));
	if (pBitmap==NULL || pBitmap->GetLastStatus() != Gdiplus::Ok) { logger.ERROR_F("转分辨率出错:" + to_string(pBitmap->GetLastStatus()));  delete pBitmap;	return FALSE; }

	Gdiplus::Status status = pBitmap->SetResolution(dpi, dpi);//设置此 Bitmap 的分辨率。
	if (status != Gdiplus::Ok) { logger.ERROR_F("转分辨率:" + to_string(status));  delete pBitmap;	return FALSE; }
	
	
	CLSID clsid;
	GetEncoderClsid(L"image/bmp", &clsid);				//Get the encoder
	status = pBitmap->Save(T2W(outFileName), &clsid);//Save the image into physical memory
	if (status != Gdiplus::Ok) { logger.ERROR_F("转分辨率后,保存错误:" + to_string(status)); delete pBitmap;	return FALSE; }
	delete pBitmap;
	
	pipe_system("del "+ (CString)fileName+"\n"); //cmd先删除
	pipe_system("rename " + (CString)outFileName + " "+ fileName +"\n"); //cmd重命名为原来的名

	return TRUE;
}

void PrintBitmap(LPCTSTR filename)
{
	setBMPResolution(filename, 600);//转为600分辨率
	checkBMPResolution(filename,600); //检查对不对



   

}

生成条码标签图片 (在模板上画文字、条码等) 

/**********************************************************************
* 函数名:void GenBarCode(HDC hDC, int iL, int iT, int iB, CString csCode, int iStyle, int iMap);
* 参  数:
*	hDC:画布句柄
*	iL:左上角 X坐标
*	iT:左上角 Y坐标
*	iB:条码高度
*	csCode:条码内容
*	iStyle:条码格式
*	iMap:
* 返回值:无
* 描  述:画条码到指定HDC
**********************************************************************/
void GenBarCode(HDC hDC, int iL, int iT, int iB, CString csCode, int iStyle, int iMap, int iWidth)
{
	COLORREF clrBar = RGB(0, 0, 0);
	COLORREF clrSpace = RGB(255, 255, 255);
	int iPenW = 2;

	switch (iStyle)
	{
	case 0:
		{
			Barcode39 code;
			code.Encode39(csCode);
			code.DrawBarcodeWidth(hDC, iL, iT, iB - 10, iB, clrBar, clrSpace, iPenW, iWidth);
		}
		break;
	case 1:
		{
			Barcode93 code;
			code.Encode93(csCode);
			code.DrawBarcodeWidth(hDC, iL, iT, iB - 10, iB, clrBar, clrSpace, iPenW, iWidth);
		}
		break;
	case 2:
		{
			Barcode128 code;
			code.Encode128A(csCode);
			code.DrawBarcodeWidth(hDC, iL, iT, iB - 10, iB, clrBar, clrSpace, iPenW, iWidth);
		}
		break;
	case 3: 
		{
			Barcode128 code;
			code.Encode128B(csCode);
			code.DrawBarcodeWidth(hDC, iL, iT, iB - 10, iB, clrBar, clrSpace, iPenW, iWidth);
		}
		break;
	case 4: 
		{
			Barcode128 code;
			code.Encode128C(csCode);
			code.DrawBarcodeWidth(hDC, iL, iT, iB - 10, iB, clrBar, clrSpace, iPenW, iWidth);
		}
		break;
	case 5: 
		{
			BarcodeI2of5 code;
			code.EncodeI2of5(csCode);
			code.DrawBarcodeWidth(hDC, iL, iT, iB - 10, iB, clrBar, clrSpace, iPenW, iWidth);
		}
		break;
	case 6: 
		{
			BarcodeEan13 code;
			code.EncodeEan13(csCode);
			code.DrawBarcodeWidth(hDC, iL, iT, iB - 10, iB, clrBar, clrSpace, iPenW, iWidth);
		}
		break;
	default:
		break;
	}
}

//生成条码标签图片 (在模板上画文字、条码等) 
void generateDeviceLable(CString g_szTemplateName, CString sn, CString imei1, CString imei2)
{
	int height, width;
	CRect rect;//定义矩形类
	CRect rect1;
	CImage image; //创建图片类

	//导入模板 自动获取宽高
	image.Load(g_szTemplateName);
	if (image == NULL) {		logger.ERROR_F("模版不存在:"+string(g_szTemplateName));		return;	}
	//int bpp=image.GetBPP();//32


	height = image.GetHeight();
	width = image.GetWidth();
	HDC memDC = image.GetDC();
	RECT rectBmp = { 0,0,width, height };
	WORD iStyle = 2; //code128

	//630 640 
	DWORD barCodeSn_left = 71, barCodeSn_top = 440, barCodeSn_bottom = 440 + 102, barCodeSn_UN = 200;
	RECT rectTextSN = { 201, barCodeSn_bottom + 7, width - 201, barCodeSn_bottom + 7 + 45 };

	DWORD barCodeImei_left = barCodeSn_left, barCodeImei_top = rectTextSN.bottom + 18, barCodeImei_bottom = barCodeImei_top + 102, barCodeImei_UN = 200;
	RECT rectTextIMEI = { 201, barCodeImei_bottom + 7, width - 201,barCodeImei_bottom + 7 + 45 };

	DWORD barCodeImei_left2 = barCodeSn_left, barCodeImei_top2 = rectTextIMEI.bottom + 18, barCodeImei_bottom2 = barCodeImei_top2 + 102, barCodeImei_UN2 = 200;
	RECT rectTextIMEI2 = { 201, barCodeImei_bottom2 + 7, width - 201, barCodeImei_bottom2 + 7 + 45 };

	BYTE *bText = (BYTE*)new char[128];
	CFont font;
	font.CreateFont(54, // nHeight 
		35, // nWidth 
		0, // nEscapement 
		0, // nOrientation 
		FW_BOLD, // nWeight 
		FALSE, // bItalic 
		FALSE, // bUnderline 
		0, // cStrikeOut 
		ANSI_CHARSET, // nCharSet 
		OUT_DEFAULT_PRECIS, // nOutPrecision 
		CLIP_DEFAULT_PRECIS, // nClipPrecision 
		DEFAULT_QUALITY, // nQuality 
		VARIABLE_PITCH | FF_SWISS, // nPitchAndFamily 
		_T("Arial")); // lpszFac 

	SelectObject(memDC, font);
	SetBkMode(memDC, TRANSPARENT);


	//画条码
	GenBarCode(memDC, barCodeSn_left, barCodeSn_top, barCodeSn_bottom, sn, iStyle, 0, width - barCodeSn_left * 2);

	//写号
	memset(bText, 0x00, sizeof(bText));
	sprintf((char *)bText, "SN:%s", sn);
	DrawText(memDC, (LPCSTR)bText, -1, &rectTextSN, DT_VCENTER);


	//画条码
	GenBarCode(memDC, barCodeImei_left, barCodeImei_top, barCodeImei_bottom, imei1, iStyle, 0, width - barCodeSn_left * 2);

	//写号
	memset(bText, 0x00, sizeof(bText));
	sprintf((char *)bText, "IMEI1:%s", imei1);
	DrawText(memDC, (LPCSTR)bText, -1, &rectTextIMEI, DT_VCENTER);

	//画条码
	GenBarCode(memDC, barCodeImei_left2, barCodeImei_top2, barCodeImei_bottom2, imei2, iStyle, 0, width - barCodeSn_left * 2);

	//写号
	memset(bText, 0x00, sizeof(bText));
	sprintf((char *)bText, "IMEI2:%s", imei2);
	DrawText(memDC, (LPCSTR)bText, -1, &rectTextIMEI2, DT_VCENTER);
	
	

	image.ReleaseDC();
	DeleteObject(font);
	delete(bText);
	system("del BarCode.bmp"); //先删除
	image.Save("BarCode.bmp"); //默认分辨率是96
	image.Destroy();

	Gdiplus::Bitmap* pBitmap = new Gdiplus::Bitmap(L"BarCode.bmp");
	pBitmap->SetResolution(600, 600);//设置此 Bitmap 的分辨率。

	CLSID jpgClsid;
	GetEncoderClsid(L"image/bmp", &jpgClsid);				//Get the encoder
	Gdiplus::Status status=pBitmap->Save(L"BarCode600.bmp", &jpgClsid);//Save the jpg image into physical memory
	if (status != Gdiplus::Ok) { logger.ERROR_F("保存错误:" + to_string(status)); return; }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小黄人软件

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值