我是C++的新手,並且在編寫使用GDI +庫在內存中創建新位圖(不打開/讀取現有位圖)的函數時遇到問題;然後繪製位圖;在保存到PNG之前。特別是,我在位圖創建和保存代碼方面遇到了問題。我受限於使用代碼塊,即使我想要,我也不能使用視覺工作室。代碼如下:是在內存中創建GDI +位圖,然後保存爲PNG
#include "drawImage.h"
#include <windows.h>
#include <objidl.h>
#include <gdiplus.h>
#include <stdio.h>
#include <iostream>
using namespace std;
using namespace Gdiplus;
drawImage::drawImage(){}
void drawImage::DrawBitmap(int width, int height){
GdiplusStartupInput gdiplusStartupInput;
ULONG_PTR gdiplusToken;
GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);
{
//Create a bitmap
Bitmap myBitmap(width, height, PixelFormatCanonical);
Graphics g(&myBitmap);
Pen blackpen(Color(255,0,0,0), 3);
//draw on bitmap
int x1 = 1;
int x2 = 200;
int y1 = 1;
int y2 = 200;
g.DrawLine(&blackpen, x1,y1,x2,y2);
// Save bitmap (as a png)
CLSID pngClsid;
GetEncoderClsid(L"image/png", &pngClsid);
myBitmap.Save(L"C:\\test\\test.png", &pngClsid, NULL);
}
GdiplusShutdown(gdiplusToken);
}
我遇到的問題如下:
的「節能」的代碼無法編譯,並給出‘GetEncoderClsid’在未聲明的錯誤消息」這個範圍「。但是,我從微軟網站here直接獲得了這個信息。我不認爲這是轉換爲PNG的正確方式,但我不知道另一種方式?當代碼編譯並運行時(通過註釋掉保存代碼),它會在「Bitmap * myBitmap = new Bitmap(width,height,PixelFormatCanonical);」這一行上崩潰。並給出一條錯誤消息,說我的可執行文件已停止工作。
我添加了'gdi32'鏈接庫和'-lgdiplus'作爲鏈接器選項。此外,我已使用this website來幫助與gdi的東西,雖然位圖部分只處理加載現有的位圖(不在內存中創建新的位圖)
我完全失去了做什麼,所以任何幫助或建議這個事情非常感謝。
'drawImage'是如何定義的?你如何調用(使用什麼參數)'DrawBitmap'? – user4407569
題外話:你正在用'new'分配一個新的對象,但是當它不再需要的時候你從不刪除它。這很糟糕,只要離開'DrawBitmap',就會導致內存泄漏。 – user4407569
感謝您的刪除建議。我來自使用垃圾收集器的編程語言。所以我仍然在學習如何做這種類型的內存管理(所以我現在將在函數結束時將其刪除)。至於你的drawImage查詢,這段代碼是非常典型的代碼,以便保持特定的問題,但我在代碼塊中創建了一個類,這就是.cpp代碼。主庫通過以下方式調用它:drawImage di; di.DrawBitmap(250,250); (使用#include「drawImage.h」作爲包含語句) – greenbeast