Пожалуйста, подскажите, есть ли в window'е библиотека, которая способна сохранять изображение из контекста устройства (hDC) в GIF файл? Или есть ли короткий и изящный способ выполнить такое сохранение?
GDI+ http://www.wasm.ru/forum/viewtopic.php?pid=263436#p263436 И поищи форуме и барахле - неоднократно всплывали исходники прямой работы с Gif без использования win.
А еще вопрос: почему при сохранении вашим способом, размер картинки получается больше, чем при сохранении фотошопом? Код (Text): Program fonts; {$APPTYPE CONSOLE} uses Windows, SysUtils; Type ImageFormatGIF = interface ['{557cf402-1a04-11d3-9a73-0000f81ef32e}'] // ['{557CF400-1A04-11D3-9A73-0000F81EF32E}'] BMP End; TGdiplusStartupInput = record nVersion: cardinal; DebugEventCallback: cardinal; SuppressBackgroundThread: cardinal; SuppressExternalCodecs: cardinal; End; Function GdiplusStartup(var GDIPlus: THandle; const tSI: TGdiplusStartupInput): integer; stdcall; external 'gdiplus.dll'; Function GdipCreateBitmapFromHBITMAP(hBitmap: THandle; param2: integer; var frHandle: THandle): integer; stdcall; external 'gdiplus.dll'; Procedure GdiplusShutdown(handle: THandle); stdcall; external 'gdiplus.dll'; Function GdipSaveImageToFile(hImage: THandle; FileName: PWideChar; const GUIDEnc: TGUID; EncParams: pointer): integer; stdcall; external 'gdiplus.dll'; Procedure GdipDisposeImage(hImage: THandle); stdcall; external 'gdiplus.dll'; // Paramstr(1) - nabor // Paramstr(2) - nSize // Paramstr(3) - fontname Const MAIN_CHAR: PWideChar = #$4E00; Var hFont, hDC, hBMP, hDesktopDC, hPrevBMP, hPrevFont, GP, frBitmap: THandle; szDirectory: string; size: TSize; Rect: TRect; char: word; GSI: TGdiplusStartupInput; FileName: widestring; Begin szDirectory := ExtractFilePath(ParamStr(0))+ParamStr(1); CreateDirectory(PChar(szDirectory), nil); szDirectory := szDirectory + '\'; // Инициализация GDI hDesktopDC := GetWindowDC(0); hFont := CreateFont(MulDiv(StrToInt(ParamStr(2)), GetDeviceCaps(hDesktopDC, LOGPIXELSY), 72), 0, 0, 0, FW_NORMAL, 0, 0, 0, DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, VARIABLE_PITCH, PChar(ParamStr(3))); hDC := CreateCompatibleDC(hDesktopDC); GetTextExtentPointW(hDC, MAIN_CHAR, 1, size); hBMP := CreateCompatibleBitmap(hDC, size.cx, size.cy); hPrevBMP := SelectObject(hDC, hBMP); hPrevFont := SelectObject(hDC, hFont); ReleaseDC(0, hDesktopDC); // Инициализация GDIPlus GSI.nVersion := 1; GdiplusStartup(GP, GSI); char := word(MAIN_CHAR); SetRect(Rect, 0, 0, size.cx, size.cy); TextOutW(hDC, 0, 0, PWideChar(@char), 1); GdipCreateBitmapFromHBITMAP(hBMP, 0, frBitmap); FileName := szDirectory+IntToStr(char)+'.gif'; GdipSaveImageToFile(frBitmap, PWideChar(FileName), ImageFormatGIF, 0); GdipDisposeImage(frBitmap); // Выход GdiplusShutdown(GP); SelectObject(hDC, hPrevFont); SelectObject(hDC, hPrevBMP); DeleteObject(hFont); DeleteObject(hBMP); DeleteDC(hDC); End.
slavanap посмотри глубину цвета в сравниваемых файлах. GDI+ по умолчанию делает её максимальной, но есть функции для её регулировки и оптимизации палитр - делается это на уровне image/bitmap до сохранения gif кодеком, читай msdn про палитры в gdi+.
Y_Mur Три с половиной тысячи просмотров и до сих пор никто не заметил, что GdiplusStartup принимает на самом деле 3 параметра. slavanap Сам gif'ами не увлекался, но могу предложить глянуть сюда: http://support.microsoft.com/kb/315780
slavanap см Bitmap::InitializePalette, Bitmap::ConvertFormat, их нужно применять после преобразования картинки GDI+, но до сохранения в gif правда сам я их не прбовал l_inc Хм - я просто подглядел у тебя то что интересовало и вставил в свою прогу , а в остальное и не вникал, не компилировал