Сохранение в GIF

Тема в разделе "WASM.WIN32", создана пользователем slavanap, 20 ноя 2008.

  1. slavanap

    slavanap Вячеслав

    Публикаций:
    0
    Регистрация:
    10 сен 2008
    Сообщения:
    300
    Адрес:
    Смоленск, Россия
    Пожалуйста, подскажите, есть ли в window'е библиотека, которая способна сохранять изображение из контекста устройства (hDC) в GIF файл?
    Или есть ли короткий и изящный способ выполнить такое сохранение?
     
  2. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    GDI+
    http://www.wasm.ru/forum/viewtopic.php?pid=263436#p263436
    И поищи форуме и барахле - неоднократно всплывали исходники прямой работы с Gif без использования win.
     
  3. slavanap

    slavanap Вячеслав

    Публикаций:
    0
    Регистрация:
    10 сен 2008
    Сообщения:
    300
    Адрес:
    Смоленск, Россия
    А еще вопрос:
    почему при сохранении вашим способом, размер картинки получается больше, чем при сохранении фотошопом?

    Код (Text):
    1. Program fonts;
    2. {$APPTYPE CONSOLE}
    3.  
    4. uses
    5.   Windows, SysUtils;
    6.  
    7. Type
    8.   ImageFormatGIF = interface
    9.   ['{557cf402-1a04-11d3-9a73-0000f81ef32e}']
    10. //  ['{557CF400-1A04-11D3-9A73-0000F81EF32E}'] BMP
    11.   End;
    12.  
    13.   TGdiplusStartupInput = record
    14.     nVersion: cardinal;
    15.     DebugEventCallback: cardinal;
    16.     SuppressBackgroundThread: cardinal;
    17.     SuppressExternalCodecs: cardinal;
    18.   End;
    19.  
    20. Function GdiplusStartup(var GDIPlus: THandle; const tSI: TGdiplusStartupInput): integer; stdcall;
    21.   external 'gdiplus.dll';
    22. Function GdipCreateBitmapFromHBITMAP(hBitmap: THandle; param2: integer; var frHandle: THandle): integer; stdcall;
    23.   external 'gdiplus.dll';
    24. Procedure GdiplusShutdown(handle: THandle); stdcall;
    25.   external 'gdiplus.dll';
    26. Function GdipSaveImageToFile(hImage: THandle; FileName: PWideChar; const GUIDEnc: TGUID; EncParams: pointer): integer; stdcall;
    27.   external 'gdiplus.dll';
    28. Procedure GdipDisposeImage(hImage: THandle); stdcall;
    29.   external 'gdiplus.dll';
    30.  
    31.  
    32. // Paramstr(1) - nabor
    33. // Paramstr(2) - nSize
    34. // Paramstr(3) - fontname
    35.  
    36. Const
    37.   MAIN_CHAR: PWideChar = #$4E00;
    38.  
    39. Var
    40.   hFont, hDC, hBMP, hDesktopDC, hPrevBMP, hPrevFont,
    41.   GP, frBitmap: THandle;
    42.   szDirectory: string;
    43.   size: TSize;
    44.   Rect: TRect;
    45.   char: word;
    46.   GSI: TGdiplusStartupInput;
    47.   FileName: widestring;
    48.  
    49. Begin
    50.   szDirectory := ExtractFilePath(ParamStr(0))+ParamStr(1);
    51.   CreateDirectory(PChar(szDirectory), nil);
    52.   szDirectory := szDirectory + '\';
    53.  
    54. // Инициализация GDI
    55.   hDesktopDC := GetWindowDC(0);
    56.   hFont := CreateFont(MulDiv(StrToInt(ParamStr(2)),
    57.      GetDeviceCaps(hDesktopDC, LOGPIXELSY), 72),
    58.      0, 0, 0, FW_NORMAL, 0, 0, 0, DEFAULT_CHARSET, OUT_DEFAULT_PRECIS,
    59.      CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, VARIABLE_PITCH, PChar(ParamStr(3)));
    60.   hDC := CreateCompatibleDC(hDesktopDC);
    61.   GetTextExtentPointW(hDC, MAIN_CHAR, 1, size);
    62.   hBMP := CreateCompatibleBitmap(hDC, size.cx, size.cy);
    63.   hPrevBMP := SelectObject(hDC, hBMP);
    64.   hPrevFont := SelectObject(hDC, hFont);
    65.   ReleaseDC(0, hDesktopDC);
    66.  
    67. // Инициализация GDIPlus
    68.   GSI.nVersion := 1;
    69.   GdiplusStartup(GP, GSI);
    70.  
    71.  
    72.  
    73.   char := word(MAIN_CHAR);
    74.  
    75.   SetRect(Rect, 0, 0, size.cx, size.cy);
    76.   TextOutW(hDC, 0, 0, PWideChar(@char), 1);
    77.   GdipCreateBitmapFromHBITMAP(hBMP, 0, frBitmap);
    78.   FileName := szDirectory+IntToStr(char)+'.gif';
    79.   GdipSaveImageToFile(frBitmap, PWideChar(FileName),
    80.     ImageFormatGIF, 0);
    81.   GdipDisposeImage(frBitmap);
    82.  
    83.  
    84. // Выход
    85.   GdiplusShutdown(GP);
    86.   SelectObject(hDC, hPrevFont);
    87.   SelectObject(hDC, hPrevBMP);
    88.   DeleteObject(hFont);
    89.   DeleteObject(hBMP);
    90.   DeleteDC(hDC);
    91. End.
     
  4. slavanap

    slavanap Вячеслав

    Публикаций:
    0
    Регистрация:
    10 сен 2008
    Сообщения:
    300
    Адрес:
    Смоленск, Россия
    Может можно каким-нибудь образом photoshop к моей програмке прикрутить?
     
  5. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    slavanap
    посмотри глубину цвета в сравниваемых файлах.
    GDI+ по умолчанию делает её максимальной, но есть функции для её регулировки и оптимизации палитр - делается это на уровне image/bitmap до сохранения gif кодеком, читай msdn про палитры в gdi+.
     
  6. slavanap

    slavanap Вячеслав

    Публикаций:
    0
    Регистрация:
    10 сен 2008
    Сообщения:
    300
    Адрес:
    Смоленск, Россия
    Блин, никак не могу сообразить, как палитру при сохранении gif'а урезать...
     
  7. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    Y_Mur
    Три с половиной тысячи просмотров и до сих пор никто не заметил, что GdiplusStartup принимает на самом деле 3 параметра. :)
    slavanap
    Сам gif'ами не увлекался, но могу предложить глянуть сюда:
    http://support.microsoft.com/kb/315780
     
  8. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    slavanap
    см Bitmap::InitializePalette, Bitmap::ConvertFormat, их нужно применять после преобразования картинки GDI+, но до сохранения в gif правда сам я их не прбовал :)
    l_inc
    Хм - я просто подглядел у тебя то что интересовало и вставил в свою прогу :), а в остальное и не вникал, не компилировал ;)