[Win Api] Wyświetlanie JPG i GIF ?

0

Witajcie

mam pytanie, otóż borykam sie z problemem wyświetlenia plików JPG i GIF, co do plików BMP nie mam problemów, jednak nie wiem jak to zrobić dla tych 2 formatów. Czy do tego potrzebne są jakieś specjlane bilbioteki ? Jeśli ktoś może niech zarzuci przykładowy kod wyświetlania.

pozdrawiam

0

co do jpega to chyba najlepiej zastosowac libjpeg a co do gifów to pewnie jest sporo gotowcow ale mozna samemu napisac...

0

Zagogluj za OleLoadPicture albo OleLoadPicturePath a zobaczysz że to łatwe.

OleLoadPicturePath jest prostsze bo nie wymaga babrania się w IStream

0

A ja proponuje GDI+. Wszystko ładnie ubrane w klasy, wystarczy pare linijek kodu, np. :

GdiplusStartupInput gdiplusStartupInput;
ULONG_PTR gdiplusToken;
Graphics* graph;
Image* img;

GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);//startujemy gdi+
graph = new Graphics(hWnd); //wczytujemy powierzchnie do rysowania, np. okno
img = new Image(L"obraz.jpg"); //wczytujemy rysunek z pliku (lub ze strumienia)
graph->DrawImage(img, 0, 0); //rysujemy rysunek na powierzchni
delete img; //zamykamy rysunek
delete graph; //zamykamy powierzchnie
GdiplusShutdown(gdiplusToken);//kończymy gdi+
0

:/ ale ja nie mam Visuala. Wystarczy GdiPlus.dll (jest w WinXP, można też ściągnąć z netu), IMPLIB do zrobienia lib'a i pliki nagłówkowe (ja użyłem tych Borlanda, ale na necie też można znaleźć do ściągnięcia).

0

sory że w pascalu ale nie maiłem tego kodu w c

procedure TImage.LoadFromFile(FileName: String);
var
  DIB: TDIBSection;
  p: IPicture;
  hFile, hMem: DWORD;
  dwFileSize,dwBytesRead: DWORD;
  pData: pointer;
  bRead: boolean;
  hRes: HRESULT;
  pStream: IStream;
//  r: Boolean;
begin
  p:= nil;
  hFile:= CreateFile(PChar(FileName), GENERIC_READ, 0 ,nil, OPEN_EXISTING, 0, 0);
  if hFile = INVALID_HANDLE_VALUE then Exit;
  try
    dwFileSize:= GetFileSize(hFile, nil);
    if dwFileSize >= INVALID_FILE_SIZE then begin CloseHandle(hFile); Exit; end;
    hMem:= GlobalAlloc(GMEM_MOVEABLE or GMEM_NODISCARD, dwFileSize);
    if hMem <= 0 then Exit;
    try
      pData:= GlobalLock(hMem);
      if pData <> nil then begin
         bRead:= ReadFile(hFile, pData^, dwFileSize, dwBytesRead, nil);
         if bRead then begin
            pStream:= nil;
            hRes:= CreateStreamOnHGlobal(hMem, True, pStream);
            if not FAILED(hRes)and(pStream <> nil) then begin
               {hRes:= }OleLoadPicture(pStream, dwFileSize, false, IID_IPicture, p);
               //r:= (hRes = S_OK)and(p <> nil);
            end;
         end;
      end;
    finally
      GlobalUnlock(hMem);
    end;
  finally
    CloseHandle(hFile);
  end;
  pStream.Release;
  pStream:= nil;
  if p <> nil then begin
     p.get_Handle(FBitmap);
     GetObject(FBitmap, SizeOf(DIB), @DIB);
     FIWidth:= dib.dsBm.bmWidth;
     FIHeight:= dib.dsBm.bmHeight;
     Width:= FIWidth;
     Height:= FIHeight;
  end;
  FBitmap:= CopyImage(FBitmap, IMAGE_BITMAP, FIWidth, FIHeight, LR_COPYRETURNORG);
  p.Release;
end;

1 użytkowników online, w tym zalogowanych: 0, gości: 1