【发布时间】:2017-01-25 21:15:09
【问题描述】:
我是 C++ 新手,在使用 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' 未在此范围内声明”。但是,我是直接从 Microsoft 网站 here 获得的。我认为这不是转换为 png 的正确方法,但我不知道另一种方法?
当代码编译并运行时(通过注释掉保存代码),它会在“Bitmap *myBitmap = new Bitmap(width, height, PixelFormatCanonical);”行崩溃并给出一条错误消息,说明我的可执行文件已停止工作。
我添加了“gdi32”链接器库和“-lgdiplus”作为链接器选项。此外,我使用this website 来帮助处理 gdi 的内容,尽管关于位图的部分仅处理加载现有位图(而不是在内存中创建新位图)
我完全不知道该怎么做,因此非常感谢您对此事的任何帮助或建议。
【问题讨论】:
-
drawImage是如何定义的?你怎么称呼(用什么参数)DrawBitmap? -
题外话:您正在使用
new分配一个新对象,但在不再需要它时您永远不会delete。这很糟糕,一旦您离开DrawBitmap,就会导致内存泄漏。 -
感谢您的删除建议。我来自使用垃圾收集器的编程语言。所以我仍在学习如何进行这种类型的内存管理(所以我现在将在函数结束时将其删除)。至于您的 drawImage 查询,此代码是非常典型的代码,以使其特定于问题,但我在代码块中创建了一个类,这是 .cpp 代码。主库通过以下方式调用它:drawImage di; di.DrawBitmap(250, 250); (以#include "drawImage.h" 作为包含语句)
-
Image::Save 有返回值。
-
我不知道
PixelFormatCanonical是什么。只需删除它或使用来自here 的值。例如Bitmap myBitmap(width, height);
标签: c++ codeblocks gdi+