1.創建并顯示
QRcode* pQR_Encode;
?? ?pQR_Encode = QRcode_encodeString("12345678901234567890", 0, QR_ECLEVEL_H, QR_MODE_8, 1);
?? ?if (pQR_Encode)
?? ?{
?? ??? ?int nBmpWidth = pQR_Encode->width;
?? ??? ?//獲取控件的邊界大小 ?
?? ??? ?CRect rect;
?? ??? ?GetDlgItem(IDC_PIC)->GetClientRect(&rect);
?? ??? ?CStatic* pic =(CStatic * )GetDlgItem(IDC_PIC);
?? ??? ?
?? ??? ?//定義并創建一個內存設備環境DC ?
?? ??? ?CDC* pCurCDC = GetDlgItem(IDC_PIC)->GetDC();
?? ??? ?//CDC *pCurCDC = GetDC();
?? ??? ?//創建兼容性的DC ?
?? ??? ?CDC* pWorkDC = new CDC;
?? ??? ??
?? ??? ?pWorkDC->CreateCompatibleDC(pCurCDC);
?? ??? ?//pWorkDC->CreateCompatibleDC(NULL);
?? ??? ? CBitmap workBitmap;
?? ??? ? CBitmap backBitmap;
?? ??? ? CDC* pBackDC = new CDC;
?? ??? ? pBackDC->CreateCompatibleDC(pCurCDC);
?? ??? ??
?? ??? ?//workBitmap.CreateCompatibleBitmap(pWorkDC, nBmpWidth, nBmpWidth);
?? ??? ?workBitmap.CreateCompatibleBitmap(pWorkDC, rect.Width(), rect.Height());
?? ??? ?backBitmap.CreateCompatibleBitmap(pBackDC, rect.Width(), rect.Height());
?? ??? ?CBitmap* pOldBitmap = pWorkDC->SelectObject(&workBitmap);//將位圖選入臨時內存設備環境
?? ??? ?CBitmap* pbackBitmap = pBackDC->SelectObject(&backBitmap);
?? ??? ?// 背景全部畫成白色
?? ??? ?pWorkDC->PatBlt(0, 0, nBmpWidth, nBmpWidth, WHITENESS);
?? ?//?? ?pBackDC->PatBlt(0, 0, nBmpWidth, nBmpWidth, WHITENESS);
?? ??? ?// 根據二維碼內容繪制位圖
?? ??? ?unsigned char* pSourceData = pQR_Encode->data;
?? ??? ?for (int i = 0; i < pQR_Encode->width; ++i)
?? ??? ?{
?? ??? ??? ?for (int j = 0; j < pQR_Encode->width; ++j)
?? ??? ??? ?{
?? ??? ??? ??? ?if (*pSourceData & 1)
?? ??? ??? ??? ?{
?? ??? ??? ??? ??? ?pWorkDC->SetPixel(i, j, RGB(0, 0, 0));
?? ??? ??? ??? ??? ?//pCurCDC->SetPixel(i, j, RGB(0, 0, 0));
?? ??? ??? ??? ?}
?? ??? ??? ??? ?pSourceData++;
?? ??? ??? ?}
?? ??? ?}
?? ??? ?pic->ModifyStyle(SS_ENHMETAFILE, SS_BITMAP | SS_CENTERIMAGE);
?? ??? ?//pic->ModifyStyle(SS_ENHMETAFILE, SS_BITMAP | SS_REALSIZEIMAGE);
?? ??? ?
?? ??? ?//pic->SetBitmap(HBITMAP(pWorkDC->GetCurrentBitmap()->GetSafeHandle()));
?? ??? ?//pic->SetBitmap((HBITMAP )workBitmap.GetSafeHandle());
?? ??? ?// 圖片顯示調用函數stretchBlt?
?? ??? ?//::StretchBlt(pCurCDC->GetSafeHdc(),335, 33, 150, 150, pWorkDC->GetSafeHdc(), 0, 0,nBmpWidth, nBmpWidth, SRCCOPY);
?? ??? ?pBackDC->StretchBlt(rect.left, rect.top, rect.Width(), rect.Height(), pWorkDC, 0, 0, nBmpWidth, nBmpWidth, SRCCOPY);
?? ?//?? ?pic->SetBitmap(HBITMAP(pCurCDC->GetCurrentBitmap()->Detach()));
?? ??? ?pWorkDC->SelectObject(pOldBitmap);
?? ?
?? ??? ?pBackDC->SelectObject(pbackBitmap);
?? ??? ?
?? ??? ?pic->SetBitmap((HBITMAP)backBitmap.Detach());
?? ??? ?DeleteObject(pOldBitmap); //刪除內存中的位圖 ?
?? ??? ?DeleteObject(pbackBitmap); //刪除內存中的位圖 ?
?? ??? ?pWorkDC->DeleteDC(); //刪除CreateCompatibleDC得到的圖片DC
?? ??? ?delete pWorkDC;
?? ??? ?pBackDC->DeleteDC();
?? ??? ?delete pBackDC;
?? ??? ?ReleaseDC(pCurCDC); //釋放獲取的DC句柄
?? ??? ?QRcode_free(pQR_Encode);
?? ?}
2.創建并保存為圖像文件
void GenerateQRcode(char* msg) {
?? ?unsigned int ? ?unWidth, x, y, l, n, unWidthAdjusted, unDataBytes;
?? ?unsigned char* pRGBData, * pSourceData, * pDestData;
?? ?QRcode* pQRC;
?? ?FILE* f;
?? ?if (pQRC = QRcode_encodeString(msg, 0, QR_ECLEVEL_H, QR_MODE_8, 1))
?? ?{
?? ??? ?unWidth = pQRC->width;
?? ??? ?unWidthAdjusted = unWidth * 8 * 3;
?? ??? ?if (unWidthAdjusted % 4)
?? ??? ??? ?unWidthAdjusted = (unWidthAdjusted / 4 + 1) * 4;
?? ??? ?unDataBytes = unWidthAdjusted * unWidth * 8;
?? ??? ?// Allocate pixels buffer
?? ??? ?if (!(pRGBData = (unsigned char*)malloc(unDataBytes)))
?? ??? ?{
?? ??? ??? ?exit(-1);
?? ??? ?}
?? ??? ?// Preset to white
?? ??? ?memset(pRGBData, 0xff, unDataBytes);
?? ??? ?// Prepare bmp headers
?? ??? ?// 位圖文件頭
?? ??? ?BITMAPFILEHEADER kFileHeader;
?? ??? ?kFileHeader.bfType = 0x4d42; ?// 位圖文件的類型,必須為"BM"
?? ??? ?kFileHeader.bfSize = sizeof(BITMAPFILEHEADER) +
?? ??? ??? ?sizeof(BITMAPINFOHEADER) + unDataBytes;// 位圖文件的大小
?? ??? ?kFileHeader.bfReserved1 = 0;// 位圖文件保留字,必須為0
?? ??? ?kFileHeader.bfReserved2 = 0;// 位圖文件保留字,必須為0
?? ??? ?kFileHeader.bfOffBits = sizeof(BITMAPFILEHEADER) +
?? ??? ??? ?sizeof(BITMAPINFOHEADER);// 位圖數據的起始位,位圖文件頭+位圖信息頭+調色板的大小
?? ??? ?// 位圖信息頭
?? ??? ?BITMAPINFOHEADER kInfoHeader;
?? ??? ?kInfoHeader.biSize = sizeof(BITMAPINFOHEADER);// 本結構所占用字節數
?? ??? ?kInfoHeader.biWidth = unWidth * 8; // 位圖的寬度,以像素為單位
?? ??? ?kInfoHeader.biHeight = ((int)unWidth * 8);// 位圖的高度,以像素為單位
?? ??? ?kInfoHeader.biPlanes = 1;// 目標設備的級別,必須為1
?? ??? ?kInfoHeader.biBitCount = 24; // 每個像素所需的位數,必須是1(雙色)、
?? ??? ??? ??? ??? ??? ??? ??? ??? ?//4(16色)、8(256色)或24(真彩色)之一
?? ??? ?kInfoHeader.biCompression = BI_RGB;// 位圖壓縮格式,必須是0,不壓縮
?? ??? ?kInfoHeader.biSizeImage = 0; // 位圖的大小,以字節為單位
?? ??? ?kInfoHeader.biXPelsPerMeter = 0; // 位圖水平分辨率
?? ??? ?kInfoHeader.biYPelsPerMeter = 0; // 位圖垂直分辨率
?? ??? ?kInfoHeader.biClrUsed = 0; // 位圖實際使用的顏色表中的顏色數
?? ??? ?kInfoHeader.biClrImportant = 0; // 位圖顯示過程中重要的顏色數,0表示所有的顏色都重要
?? ??? ?// Convert QrCode bits to bmp pixels
?? ??? ?pSourceData = pQRC->data;
?? ??? ?for (int y = unWidth - 1; y >= 0; y--)
?? ??? ?{
?? ??? ??? ?pDestData = pRGBData + unWidthAdjusted * y * 8;
?? ??? ??? ?// y
?? ??? ??? ?for (x = 0; x < unWidth; x++)
?? ??? ??? ?{
?? ??? ??? ??? ?if (*pSourceData & 1)
?? ??? ??? ??? ?{
?? ??? ??? ??? ??? ?for (int l = 0; l < 8; l++)
?? ??? ??? ??? ??? ?{
?? ??? ??? ??? ??? ??? ?for (int n = 0; n < 8; n++)
?? ??? ??? ??? ??? ??? ?{
?? ??? ??? ??? ??? ??? ??? ?*(pDestData + n * 3 + unWidthAdjusted * l) = 0;
?? ??? ??? ??? ??? ??? ??? ?*(pDestData + 1 + n * 3 + unWidthAdjusted * l) = 0;
?? ??? ??? ??? ??? ??? ??? ?*(pDestData + 2 + n * 3 + unWidthAdjusted * l) = 0;
?? ??? ??? ??? ??? ??? ?}
?? ??? ??? ??? ??? ?}
?? ??? ??? ??? ?}
?? ??? ??? ??? ?pDestData += 3 * 8;
?? ??? ??? ??? ?pSourceData++;
?? ??? ??? ?}
?? ??? ?}
?? ??? ?// Output the bmp file
?? ??? ?if (!(fopen_s(&f, "temp.bmp", "wb")))
?? ??? ?{
?? ??? ??? ?fwrite(&kFileHeader, sizeof(BITMAPFILEHEADER), 1, f);
?? ??? ??? ?fwrite(&kInfoHeader, sizeof(BITMAPINFOHEADER), 1, f);
?? ??? ??? ?fwrite(pRGBData, sizeof(unsigned char), unDataBytes, f);
?? ??? ??? ?fclose(f);
?? ??? ?}
?? ??? ?else
?? ??? ?{
?? ??? ??? ?printf("Unable to open file");
?? ??? ??? ?exit(-1);
?? ??? ?}
?? ??? ?// Free data
?? ??? ?free(pRGBData);
?? ??? ?QRcode_free(pQRC);
?? ?}
?? ?else
?? ?{
?? ??? ?printf("NULL returned");
?? ??? ?exit(-1);
?? ?}
}