![]() |
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 |
Re: JPEG Datei in NonVCL Prog laden
Kuckst du hier:
![]() |
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 |
Re: JPEG Datei in NonVCL Prog laden
|
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 |
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 |
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}';
|
Re: JPEG Datei in NonVCL Prog laden
Zitat:
Zitat:
|
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:
Und was soll ich sagen ... ICH KANN JPEG´s LADEN!!!! Läuft wie geschmiert. Hier die offenen Delphi-Sossen:
IID_IPicture : TGUID = '{7BF80980-BF32-101A-8BBB-00AA00300CAB}';
Delphi-Quellcode:
Gute N8 und noch mal DANKE an Luckie
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; OLLI |
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. |
Re: JPEG Datei in NonVCL Prog laden
Zitat:
|
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:
Bin gerade dabei das Teil in meine DIB-Klasse einzubinden. Jetzt gibt es endlich einen Constructor CreateFromJPEGRessource. :dancer:
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; Tschau OLLI |
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:
dann im finally-Teil stehen sollte.
CloseHandle(hFile);
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:
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:
if(dwFileSize = INVALID_FILE_SIZE) then exit;
Delphi-Quellcode:
Meine IPicture-Variable ist übrigens lokal, heißt "pPic" und wird als VAR-Parameter an deine (von mir leicht umgeschriebene) Funktion "LoadPicture" übergeben.
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; So, meine eigene Frage betrifft jetzt lediglich den Sinn der Werte 2540 in den Zeilen
Delphi-Quellcode:
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?
nWidth := MulDiv(hmWidth,GetDeviceCaps(DC,LOGPIXELSX),2540);
nHeight := MulDiv(hmHeight,GetDeviceCaps(DC,LOGPIXELSY),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