我是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