Версия для печати
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум на Исходниках.RU > Графика, звук, анимация, игры > Загрузка изображений средствами GDI Plus


Автор: Maksim V. 15.03.10, 18:11
Может быть кому-нибудь пригодиться данный код или он послужит отправной точкой. Аналогия WinApi функции LoadImage без каких-либо примочек, простенько, но свою задачу выполняет. Для одного проекта требовалось поместить на STATIC PNG изображение, пришлось написать такой вот код.

<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    unit F_GdipImg;
     
    {
    GdipLoadImage(hInstance, MAKEINTRESOURCEW(RC_IMAGE), TYPE_RCDATA, GetSysColor(COLOR_BTNFACE));
    GdipLoadImage(hInstance, MAKEINTRESOURCEW(RC_IMAGE), TYPE_PNG, GetSysColor(COLOR_BTNFACE));
    GdipLoadImage(hInstance, MAKEINTRESOURCEW(RC_IMAGE), TYPE_GIF, GetSysColor(COLOR_BTNFACE));
    GdipLoadImage(hInstance, MAKEINTRESOURCEW(RC_IMAGE), TYPE_JPEG, GetSysColor(COLOR_BTNFACE));
    GdipLoadImage(0, 'C:\Image.png', TYPE_SHARED, GetSysColor(COLOR_BTNFACE));
    }
     
    interface
     
    uses
      Windows, F_GdiPlus, F_IStream;
     
    const
      TYPE_RCDATA = 1;
      TYPE_PNG    = 2;
      TYPE_GIF    = 3;
      TYPE_JPEG   = 4;
      TYPE_SHARED = 5;
     
    function GdipLoadImage(hinst: HMODULE; lpszName: PWideChar; uType: UINT; RgbClr: TColorRef): HBITMAP;
     
    implementation
     
    //
     
    function GdipLoadImage(hinst: HMODULE; lpszName: PWideChar; uType: UINT; RgbClr: TColorRef): HBITMAP;
    var
      hRes     : HRSRC;
      dwResSize: DWORD;
      hResLoad : HGLOBAL;
      lpResLock: Pointer;
      hMem     : HGLOBAL;
      pData    : Pointer;
      hr       : HRESULT;
      pStream  : IStream;
      Bitmap   : TGpImage;
      hGlob    : HGLOBAL;
      lpszType : PWideChar;
    begin
     
      Result := 0;
     
      case uType of
     
        TYPE_SHARED:
          begin
     
            GdipLoadImageFromFile(lpszName, Bitmap);
            if (Bitmap <> nil) then
            try
              GdipCreateHBITMAPFromBitmap(Bitmap, Result, ColorRefToARGB(RgbClr));
            finally
            // GdipLoadImageFromFile.
              GdipDisposeImage(Bitmap);
            end;
     
          end;
     
        else
     
          begin
     
            case uType of
              TYPE_RCDATA: lpszType := MAKEINTRESOURCEW(RT_RCDATA);
              TYPE_PNG   : lpszType := 'PNG';
              TYPE_GIF   : lpszType := 'GIF';
              TYPE_JPEG  : lpszType := 'JPEG';
            end;
     
            hRes := FindResourceW(hinst, lpszName, lpszType);
            if (hRes <> 0) then
            try
              dwResSize := SizeofResource(hinst, hRes);
              if (dwResSize <> 0) then
              try
                hResLoad := LoadResource(hinst, hRes);
                if (hResLoad <> 0) then
                try
                  lpResLock := LockResource(hResLoad);
                  if (lpResLock <> nil) then
                  try
                    hMem := GlobalAlloc(GMEM_MOVEABLE, dwResSize);
                    if (hMem <> 0) then
                    try
                      pData := GlobalLock(hMem);
                      if (pData <> nil) then
                      try
                        // если передать TRUE в CreateStreamOnHGlobal, то поток сам
                        // освободит выделенную память и не потребуется использовать
                        // GetHGlobalFromStream.
                        CopyMemory(pData, lpResLock, dwResSize);
                        pStream := nil;
                        hr := CreateStreamOnHGlobal(hMem, FALSE, pStream);
                        if (hr = S_OK) then
                        try
                          GdipLoadImageFromStream(pStream, Bitmap);
                          if (Bitmap <> nil) then
                          try
                            GdipCreateHBITMAPFromBitmap(Bitmap, Result, ColorRefToARGB(RgbClr));
                          finally
                          // GdipLoadImageFromStream.
                            GdipDisposeImage(Bitmap);
                          end;
                        finally
                        // CreateStreamOnHGlobal.
                          hr := GetHGlobalFromStream(pStream, hGlob);
                          if (hr = S_OK) then
                            GlobalFree(hGlob);
                          pStream := nil;
                        end;
                      finally
                      // GlobalLock.
                      end;
                    finally
                    // GlobalAlloc.
                      GlobalUnlock(hMem);
                      GlobalFree(hMem);
                    end;
                  finally
                  // LockResource.
                    UnlockResource(HGLOBAL(lpResLock));
                  end;
                finally
                // LoadResource.
                  FreeResource(hResLoad);
                end;
              finally
              // SizeofResource.
              end;
            finally
            // FindResource.
            end;
     
          end;
     
      end;
     
    end;
     
    end.

Powered by Invision Power Board (https://www.invisionboard.com)
© Invision Power Services (https://www.invisionpower.com)