jpg-Dateien und MFC



  • Hallo liebes Forum, ich weiss, dieses Thema war schon oft dran...

    aber vermutlich bin ich einfach zu blöd... Ich habe über die Suche schon einiges erfahren, aber trotzdem klappt es einfach nicht.

    Mein Problem:
    Ich möchte in einem MFC-Programm eine jpg Datei anzeigen, und diese ggf. unter einem andren Namen speichern (nicht umbenennen).

    Jetzt bin schon auf Dinge wie OleLoadPicture oder die Gdiplus gestossen.. aber ich steig da irgendwie nicht durch (OleLoadPicture braucht nen Stream (was auch immer das ist) und die Gdiplus läuft nicht (trotz winXP) bzw. wird in der WinMain initialisiert (die hab ich nicht) ...

    ... kann mir bitte jemand mal ne deutsche Anleitung geben ???

    Das was die anderen sites so bringen ist meist auf Englisch, und mein reicht da wohl nicht ganz aus 😞

    Danke

    Stefan



  • ich hab das aus einem sehr alten test projekt kopiert, ich weiss nicht ob da noch was fehlt.

    das ist die deklaration, es kommt in die H-Datei rein:

    IPicture *m_bild;
    void DrawBild(IPicture *bild);
    

    Dieser aufruf kommt in die Initialisierungs Funktion rein, Bei Dialoganwendungen zb. OnInitDialog()

    OleLoadPicturePath("absoluter pfad oder adresse zu einem jpg bild", 0, 0, 0, IID_IPicture,(void **)&m_bild);
    

    So sieht die Funktion aus die dann das bild zeichnet.

    void CTestDlg::DrawBild(IPicture *bild)
    {
       CClientDC dc(this);
    
       CRect rc;
       GetClientRect(&rc);
    
       OLE_XSIZE_HIMETRIC width;
       OLE_YSIZE_HIMETRIC height;
    
       bild->get_Width(&width);
       bild->get_Height(&height);
    
       bild->Render(dc, 100, 100, 200, 118, 0, height, width, -height, &rc); 
    }
    


  • Erst mal vielen Dank für die schnelle Antwort...

    Hat leider (noch) nichts gebracht... Zunächst liess sich kein String eintragen, der den Bildnamen angibt (braucht ja an der Stelle auch nen Long und keinen String).. habs dann mit ner Konvertierung über LPOLESTR probiert, hat dann aber zur Folge gehabt, dass das Programm abstürzt...

    Aufruf über DrawPic(m_bild);

    Deklaration: void DrawPic(IPicture* bild)

    Danke nochmal...

    und das 2. Problem (das des Speicherns) ist damit leider auch nicht gelöst

    Guss
    Stefan



  • der LPOLESTR ist auch nur (w)char-array

    wenn der pfad zur datei in einem CString steckt müsste .GetBuffer() reichen. gegebenfalls diesen pointer den GetBuffer zurückliefert einfach casten.

    zum speichern kommts drauf an ob auch ein einfachs kopieren der datei genügt - CopyFile()



  • Ne.. einfach CopyFile() wär ja zu einfach...

    Sinn und Zweck der Übung ist es, das Bild (ggf. später auch ein *.bmp) als jpeg zu speichern... Ich hab das ganze mal mit VB6.0 gemacht, da war es einfach weil einfach ne dll/Komponente eingebunden wurde, die mir die ganze Funktionalität zu Verfügung stellte..

    Danke noch mal für die Antwort, werde das mit .GetBuffer() mal probieren...

    Wenn noch jemand Anregungen hat.. bin für alles dankbar

    Gruss

    Stefan



  • Habs jetzt mal mit .GetBuffer(); versucht.. funzt auch nicht.. hier mal der Codeschnipsel aus der Pictest3Dlg.cpp :
    [cpp][code]
    CString name="15.jpg";
    LPTSTR n=name.GetBuffer(6);
    OleLoadPicturePath(n, 0, 0, 0, IID_IPicture,(void **)&m_bild);
    DrawPic(m_bild);

    Die Methode
    void DrawPic(IPicture* bild) ^
    { ... }
    steht ebenfalls ind der cpp-Datei

    der Aufruf allerdings führt zum Programmabsturz (ohne Kompiler/Linker Fehler)

    Gruss und Danke

    Stefan



  • also ich habs jetzt kurz getestet.

    erstens muss es ein absoluter und kein relativer pfad sein. dazu darf der aufruf zum zeichnen nicht in einer initialisierungs funktion stecken da sonst kein bild angezeigt wird, er muss also später erfolgen .. nach der initialisierung. und muss erneut gezeichnet werden wenn ein fenster drüber geht oder außerhalb vom sichtbaren desktop bewegt wird .. hier eventuell OnPaint().

    beim speichern und dazu in einem anderen dateiformat ist etwas komplizierter. vielleicht solltest du hier eher nach entsprechenden libraries suchen die das machen. kennen tu ich da jetzt keine.



  • Habe jetzt den Funktionsaufruf für DrawPic(IPicture* bild) in die Funktion OnButton() gesetzt, und als Dateiname den kompletten Pfad "d:\\15.jpg" angegeben... funzt trotzdem nicht.. permaneter Absturz nach Drücken auf Button1 ...

    weiss auch nciht mehr weiter...

    Danke und Gruss

    Stefan



  • OleLoadPicturePath erfordert einen Unicode-String. Du solltest also L"d:\\15.jpg" schreiben.

    Ansonsten mit F5 den Debugger starten, der zeigt Dir dann schon die fehlerverursachende Stelle.



  • ok.. habs jetzt mit L"bild15.jpg" probiert... Juhu.. es tut...

    bleibt nur noch das Prob mit dem Speichern.... habe da was von GDI+ gelesen.. wer das mal versuchen, wenn ich die header-Datei finde.. auf meinem XP-Rechner ist sie nicht 😞

    Vielleicht kann mir ja noch jemand was zu CImage sagen... keine Ahnug, wie das eingebunden werden soll

    Danke....

    Gruss

    Stefan



  • stefan-rw schrieb:

    Vielleicht kann mir ja noch jemand was zu CImage sagen... keine Ahnug, wie das eingebunden werden soll

    atlimage.h einbinden und dann hast du alle Methoden in der MSDN erklärt so schwer is das doch nicht

    schaust du hier:
    http://msdn.microsoft.com/en-us/library/5eb252d0(VS.80).aspx

    Laden sollte dann schon mal klar sein, Zeichnen geht einfach über BitBlt und save wirst du auch noch finden so schwer is das nun wirklich nicht, hab das selber schon mal verwendet und das is eigentlich einfach. ich weiss net wo das problem da liegt, ansonnsten noch mal genauer nachfragen wo du probleme hat



  • hehe.. habe gestern noch mal meine ganzen HDD's gecheckt... habe weder die atlimage.h noch die gdiplus.h ...

    ...

    Wenn ich die hätte, wärs wohl einfacher *grins*

    hat jemand ne Downloadadresse für mich... wär echt nett

    Danke

    Stefan



  • Wie wäre es mit der FAQ. Dort ist alles was Du brauchst.


Anmelden zum Antworten