Использование файлов .png вместо использования файлов .ico в программах Windows - PullRequest
3 голосов
/ 29 июня 2009

привет, у меня есть коллекция хороших .png файлов .... тем временем я занимаюсь разработкой программного обеспечения на основе win и мне нужны файлы .ico в виде значков для кнопок панели инструментов и ...

Можно ли использовать файл .png в качестве значка? или что?

Спасибо

Ответы [ 4 ]

8 голосов
/ 29 июня 2009

В качестве обходного пути вы можете использовать IrfanView для преобразования вашего * .png файла в * .ico файл (или любое другое изображение в ico) и использовать его.

http://www.irfanview.com/main_download_engl.htm

1 голос
/ 11 июня 2010

Вы можете просто конвертировать изображения в ico файлы онлайн Icon Convert .

1 голос
/ 29 июня 2009

Если вы используете .NET, то это не является для вас реальной проблемой, потому что уже встроена поддержка PNG. Возможно, вы говорите о разработке на C / C ++ с использованием GDI / win32?

Насколько мне известно, вы не достигнете этого, просто используя GDI. Есть пара опций, в которых вы можете установить ОДИН цвет как прозрачный, затем загрузить простой BMP / JPEG и выполнить некоторые трюки с BITMAP, однако использовать ICO / GIF будет намного проще.

Что вы, вероятно, ищете, это рабочий пример GDI +, который будет использовать 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 + действительно требует значительных ресурсов процессора / памяти по нескольким причинам. Хотя забавно, я отказался от этого подхода в пользу gdi и простых BMP.

0 голосов
/ 29 июня 2009

Если вы загружаете изображения из файла ресурсов, то нет, вы не можете использовать PNG, вы должны использовать ICO. К счастью, существует ряд инструментов, которые могут преобразовывать PNG в ICO, включая ImageMagick (отлично подходит для автоматизации) и MSPaint в качестве наименьшего общего знаменателя.

Если вы загружаете файлы изображений во время выполнения, вы можете загрузить любой тип формата изображения, который вы хотите (например, использовать libpng для загрузки PNG), но вам все равно придется преобразовать их в значки перед вы можете делать с ними интересные вещи, например, устанавливать их как значок окна. После того, как вы расшифровали данные изображения, не очень сложно преобразовать их в надлежащий формат, но это не тривиально, это просто связано с большим количеством манипулирования данными и странными структурами и вызовами функций из Win32 API.

...