Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi JPEG Datei in NonVCL Prog laden (https://www.delphipraxis.net/12077-jpeg-datei-nonvcl-prog-laden.html)

OLLI_T 20. Nov 2003 09:21


JPEG Datei in NonVCL Prog laden
 
Hallo und guten Morgen!

Ich suche für meine NonVCL Programme eine Möglichkeit, JPEG Bilder aus einer Datei laden zu können. Lässt sich das eventuell irgendwie mit Windows Bordmitteln bewerkstelligen? COM oder ne DLL, die ich anzapfen kann? Eine Delphi-Unit, die keine VCL Units nutzt, wäre auch genehm.
Brauche nix weiter als das Handle auf ne Bitmap. Speichern ist nicht nötig.

Vielen Dank schon mal und Gruss an alle

OLLI

Luckie 20. Nov 2003 09:37

Re: JPEG Datei in NonVCL Prog laden
 
Kuckst du hier: http://www.assarbad.org/stuff/ -> screenshotclass (untere Drittel). Zwar kein JPG aber dafür PNG, eventuell hilft das ja schon weiter.

OLLI_T 20. Nov 2003 09:58

Re: JPEG Datei in NonVCL Prog laden
 
Danke Luckie!


Das Material von Assa hab ich schon gesichtet. Leider kann ich damit nur PNG speichern aber nicht laden. :cry:

Tschau

Luckie 21. Nov 2003 19:34

Re: JPEG Datei in NonVCL Prog laden
 
Ich habe was. Ich habe was. :firejump: *juhu*
http://www.c-plusplus.de/forum/viewtopic.php?t=39384

OLLI_T 21. Nov 2003 20:11

Re: JPEG Datei in NonVCL Prog laden
 
Hey Luckie! :thuimb:

Das sieht toll und recht einfach aus, was Du da gesichtet hast. Ich geh jetzt in die Wanne und dann versuch ich den Spass mal nach Delphi zu übersetzen. Oder sitzt Du etwa schon dran?

Also vielen Dank und ich wünsch Dir ein extra schönes WE

Und ... keep on pumping! :wink:

OLLI

OLLI_T 21. Nov 2003 20:36

Re: JPEG Datei in NonVCL Prog laden
 
Hilfääääääää!

Jetzt hab ich den Code soweit fertig und es scheitert an ner Kleinigkeit. Hab Delphi 5 und bei mir ist die Interface-ID IID_IPicture noch nicht deklariert. Kann bitte bitte jemand in der Unit Active-X nachschauen und mir die Zeile posten! Das wäre total nett.

Vielen dank schon mal

OLLI

choose 21. Nov 2003 21:18

Re: JPEG Datei in NonVCL Prog laden
 
Hallo OLLI,

ich hoffe, dass ist, was du benötigst:
Delphi-Quellcode:
IID_IPicture: TGUID = '{000208A6-0001-0000-C000-000000000046}';

Luckie 21. Nov 2003 21:41

Re: JPEG Datei in NonVCL Prog laden
 
Zitat:

Zitat von OLLI_T
Das sieht toll und recht einfach aus, was Du da gesichtet hast. Ich geh jetzt in die Wanne und dann versuch ich den Spass mal nach Delphi zu übersetzen. Oder sitzt Du etwa schon dran?

nein, ich übersetzte sowas immer erst wenn ich es brauche. Aber ich hoffe du machst das OpenSource? :wink:
Zitat:

Also vielen Dank und ich wünsch Dir ein extra schönes WE
Ich dir auch, war aber nicht nötig.

OLLI_T 21. Nov 2003 22:10

Re: JPEG Datei in NonVCL Prog laden
 
HY Choose!

Mit Deinem Wert klappt es nicht. Habe im Netz der Netz diese Lottozahlen gefunden:

Delphi-Quellcode:
  IID_IPicture : TGUID = '{7BF80980-BF32-101A-8BBB-00AA00300CAB}';
Und was soll ich sagen ... ICH KANN JPEG´s LADEN!!!! Läuft wie geschmiert. Hier die offenen Delphi-Sossen:

Delphi-Quellcode:
Var
  pPicture:IPicture;

Function LoadPicture(AFile: String):Boolean;
Var
  hFile,hMem:THandle;
  dwFileSize,dwBytesRead:DWord;
  pData:Pointer;
  bRead:Boolean;
  hRes:HResult;
  pStream:IStream;
Begin
  // open file
  Result:=FALSE;

  hFile:=CreateFile(PChar(AFile),GENERIC_READ,0,NIL,OPEN_EXISTING,0,0);
  if (hFile = INVALID_HANDLE_VALUE) Then Exit;

  // get file size
  dwFileSize:=GetFileSize(hFile,NIL);
  If (dwFileSize = -1) Then Exit;

  // get memory objekt
  hMem:=GlobalAlloc(GMEM_MOVEABLE Or GMEM_NODISCARD, dwFileSize);
  If(hMem = 0) Then Exit;

  pData := GlobalLock(hMem);
  If (pData = NIL) Then Exit;

  bRead:=ReadFile(hFile, pData^ , dwFileSize, dwBytesRead, NIL);
  CloseHandle(hFile);
  GlobalUnlock(hMem);
  If Not(bRead) Then Exit;

  // create IStream from global memory
  pStream:=NIL;
  hRes:=CreateStreamOnHGlobal(hMem, TRUE, pStream);

  If FAILED(hRes) Or (pStream = NIL) Then exit;

  // Create IPicture from image file
  hRes := OleLoadPicture(pStream, dwFileSize, FALSE, IID_IPicture, pPicture);
  If (hRes=S_OK) And (pPicture <> NIL) Then Result:=TRUE;

  pStream := NIL;
End;
Gute N8 und noch mal DANKE an Luckie

OLLI

Luckie 21. Nov 2003 22:22

Re: JPEG Datei in NonVCL Prog laden
 
Schön. Und wo wird es hingeladen? Wie kann man es jetzt darstellen? Schön wäre es, wenn ich ein HBITMAP rausbekäme, welches ich dann in ein Static oder so anzeigen könnte.

Und die vielen Exits gefallen mir nicht. Ich mache da über das WE mal etwas.

choose 21. Nov 2003 22:32

Re: JPEG Datei in NonVCL Prog laden
 
Zitat:

Zitat von OLLI_T
HY Choose! Mit Deinem Wert klappt es nicht.

Sorry, mein Fehler: Habe fälschlicher Weise die IID aus den MSOffice-Server-Beschreibungen gezogen. Die Deklaration aus OleCtl, der Unit in der die von Dir benutzte Funktion OleLoadPicture eingebunden wird, stimmt mit der von Dir geposteten Version überein.

OLLI_T 21. Nov 2003 22:32

Re: JPEG Datei in NonVCL Prog laden
 
Hey, jetzt nicht meckern. Ich hab das so nur zu Demozwecken gemacht!

So bekommst Du das PIC zu sehen ... :

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
Var hRes:HResult; DC,DCpic:HDC; DCout:HDC; BmpOut:OLE_HANDLE;
begin
  If LoadPicture('C:\Button.jpg') Then Begin
    DC:=GetDC(0);
    DCpic:=CreateCompatibleDC(DC);
    ReleaseDC(0,DC);
    pPicture.SelectPicture(DC1,DCout,BmpOut);
    BitBlt(Canvas.Handle,0,0,100000,100,DC1,0,0,SRCCOPY);
    pPicture:=NIL; DeleteDC(DCpic);
  End;
end;
Bin gerade dabei das Teil in meine DIB-Klasse einzubinden. Jetzt gibt es endlich einen Constructor CreateFromJPEGRessource. :dancer:

Tschau

OLLI

MathiasSimmack 23. Nov 2003 12:47

Re: JPEG Datei in NonVCL Prog laden
 
Ich habe mir das eben mal angeschaut, und muss sagen:

@OLLI_T: Du hast einen furchtbaren Programmierstil. Mal schreibst du Schlüsselworte klein, dann wieder am Anfang groß. Mal lässt du ein Leerzeichen bei Vergleichen, dann wieder nicht. Ja ja, ich weiß, es war nur zu Demozwecken. Trotzdem ... Na ja, und die vielen exit-Anweisungen, was ja auch Luckie schon erwähnt hat ... hm ...
Wenn die Datei zwar geöffnet werden konnte, aber bspw. das Lesen nicht funktioniert, dann verlässt du deine Prozedur, ohne vorher das Handle "hFile" wieder freizugeben. Das würde nicht passieren, wenn du das ganze in try/finally einklammerst, wobei
Delphi-Quellcode:
CloseHandle(hFile);
dann im finally-Teil stehen sollte.

Und für den Fall, dass mal mit der Dateigröße etwas nicht stimmt, wirst du vermutlich ein paar Fehler kassieren, denn bei mir meckert der Compiler (D5) hier
Zitat:

Delphi-Quellcode:
If (dwFileSize = -1) Then Exit;

dass der Vergleich immer Falsch ergibt. Ein DWord hat kein Vorzeichen und kann daher auch nicht kleiner als Null werden. Richtig wäre IMHO
Delphi-Quellcode:
if(dwFileSize = INVALID_FILE_SIZE) then exit;
Und dann funktioniert deine Button-Klickprozedur nicht. "hRes" wird nie benötigt, und im Code findet man ein "DC1", von dem man nicht erfährt, woher es stammt. Ich habe stattdessen die "Show"-Funktion aus dem C-Sample als Grundlage benutzt, und es hat sofort problemlos geklappt:
Delphi-Quellcode:
if(LoadPicture('Dateiname.jpg',pPic)) then begin
  DC := GetDC(wnd);

  if(pPic.get_Width(hmWidth) = S_OK) and
    (pPic.get_Height(hmHeight) = S_OK) and
    (GetClientRect(wnd,rc)) then
  begin
    nWidth := MulDiv(hmWidth,GetDeviceCaps(DC,LOGPIXELSX),2540);
    nHeight := MulDiv(hmHeight,GetDeviceCaps(DC,LOGPIXELSY),2540);

    pPic.Render(DC,0,0,nWidth,nHeight,0,hmHeight,hmWidth,
      -hmHeight,rc);
  end;

  ReleaseDC(wnd,DC);
end;
Meine IPicture-Variable ist übrigens lokal, heißt "pPic" und wird als VAR-Parameter an deine (von mir leicht umgeschriebene) Funktion "LoadPicture" übergeben.

So, meine eigene Frage betrifft jetzt lediglich den Sinn der Werte 2540 in den Zeilen
Delphi-Quellcode:
    nWidth := MulDiv(hmWidth,GetDeviceCaps(DC,LOGPIXELSX),2540);
    nHeight := MulDiv(hmHeight,GetDeviceCaps(DC,LOGPIXELSY),2540);
Damit kann ich, offen gestanden, im Moment nichts anfangen. Ich weiß, dass die integer-Werte "hmWidth" und "hmHeight" nicht den Pixelmaßen entsprechen, und dass sie deshalb mit "MulDiv" umgerechnet werden. Aber woher bzw. woraus/wovon ergibt sich die 2540?

Gruß.


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:54 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz