嗨我有很好的.png文件集合.... 同时,我正在开发一个基于win的软件,需要一些.ico文件作为工具栏按钮的图标......
有没有办法将.png文件用作图标?或者什么?
谢谢
答案 0 :(得分:8)
作为一种解决方法,您可以使用IrfanView将* .png文件转换为* .ico文件(或任何其他图像转换为ico)&用它。
答案 1 :(得分:1)
如果您正在使用.NET,这对您来说不是一个真正的问题,因为已经内置了afaik PNG支持。您可能正在讨论使用GDI / win32进行本机C / C ++开发?
据我所知,你不会通过简单地使用GDI来实现这一点。有几个选项可以将ONE颜色设置为透明,然后加载一个简单的BMP / JPEG并执行一些BITMAP技巧,但使用ICO / GIF会更容易。
您可能正在寻找的是一个有效的GDI +示例,它将使用带有Alpha通道的PNG?这只是一个摘录,我遗漏了从DLL部分加载外部函数的整个混乱,但这可能会对你有帮助:
static GpImage *background = NULL;
GDIPLOADIMAGEFROMSTREAM GdipLoadImageFromStream;
GDIPLUSSTARTUP GdiplusStartup;
GDIPPLUSSHUTDOWN GdiplusShutdown;
GDIPCREATEFROMHDC GdipCreateFromHDC;
GDIPDELETEGRAPHICS GdipDeleteGraphics;
GDIPDRAWIMAGEI GdipDrawImageI;
GDIPDRAWIMAGERECTI GdipDrawImageRectI;
GDIPLUS_STARTUP_INPUT GdiplusStartupInput;
void LoadPNG(GpImage **image, int resource, HMODULE hInstance)
{
HRSRC resrc;
LPSTREAM lpstr;
HGLOBAL hPng;
LPVOID fByte;
GpImage *img = NULL;
resrc = FindResource(GetModuleHandle(NULL), MAKEINTRESOURCE(resource), TEXT("PNG"));
hPng = LoadResource(GetModuleHandle(NULL), resrc);
fByte = LockResource(hPng);
lpstr = SHCreateMemStream(fByte, 200000);
GdipLoadImageFromStream(lpstr, &img);
*image = img;
}
void CreateBack(HWND hWnd)
{
HDC memDC = NULL;
HDC hdc = NULL;
RECT rect;
DeleteObject(curBack);
GetClientRect(hWnd, &rect);
hdc = GetDC(hWnd);
memDC = CreateCompatibleDC(hdc);
curBack = CreateCompatibleBitmap(hdc, rect.right, 44);
SelectObject(memDC, curBack);
/* gdiplus - background*/ {
int e = 0;
GpGraphics *g;
GdipCreateFromHDC(memDC, &g);
GdipDrawImageRectI(g, background, e, 0, 971, 44);
GdipDeleteGraphics(g);
}
DeleteObject(memDC);
ReleaseDC(hWnd, hdc);
}
快速说明:由于几个原因,这个GDI +内存实际上是CPU /内存密集型的。虽然很有趣但我放弃了这种方法,转而采用gdi和简单的BMP。
答案 2 :(得分:1)
您只需将图像转换为在线Icon Convert的ico文件。
答案 3 :(得分:0)
如果您要从资源文件加载图像,那么不,您不能使用PNG,您必须使用ICO。幸运的是,有许多工具可以将PNG转换为ICO,包括ImageMagick(非常适合自动化),MSPaint作为最低标准。
如果你在运行时加载图像文件,那么你可以加载你想要的任何类型的图像格式(例如使用libpng加载PNG),但你仍然必须在内部将它们转换为图标用它们做有趣的事情,比如将它们设置为窗口的图标。一旦你解码了图像数据,将它转换为正确的格式并不是非常困难,但它并不简单,它只涉及大量的数据修改和来自Win32 API的奇怪结构和函数调用。