我刚学习C++,在使用GDI+库编写一个函数创建新位图(不是打开/读取现有位图),然后在位图上绘制后保存为png时遇到了问题。特别是在位图创建和保存代码方面,我遇到了困难。我受限于使用codeblocks,并且即使我想要也不能使用visual studios。下面是代码:
#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' was not declared in this scope”。然而,我是从微软官网这里获取的。我不认为这是转换为png的正确方法,但我不知道有什么替代方法?
当编译并运行代码(注释掉保存代码)时,它会在“Bitmap *myBitmap = new Bitmap(width, height, PixelFormatCanonical);”这一行崩溃,并显示一个错误消息,指出我的可执行文件已停止工作。
我已添加“gdi32”链接库,并将“-lgdiplus”作为链接器选项。此外,我使用了这个网站来帮助理解gdi内容,尽管位图部分只涉及加载现有位图(而不是在内存中创建新位图)。
我完全不知道该怎么做,所以非常感谢您对此事提供任何帮助或建议。
GdiplusStartup
函数? - user4407569Bitmap *myBitmap = new Bitmap(width, height, PixelFormatCanonical);
这种写法很不寻常。为什么不利用 C++ 中内置的自动垃圾回收机制,即Bitmap myBitmap(width, height, PixelFormatCanonical);
? - IInspectablePixelFormatCanonical
是什么。只需将其删除或使用此处中的值。例如:Bitmap myBitmap(width, height);
- Barmak Shemirani