Bild (jpg, bmp) öffnen und anzeigen lassen ?



  • Hallo;
    wie kann ich ein Bild öffnen und in einer PaintBox zeichnen (mit Draw etc) ?

    das bild soll sich dann wie ien ball von ecke zu ecke bewegen - das klappt auch allerdings - habe ich nur standardtbilder(meine eigenen). der benutzer soll aber auch die bilder seiner liebsten einbauen können.....

    Wäre supi wenn ihr mir mal sagt wie das geht.

    Desweiteren habe ich schon den TImageOpenDialog gefunden. Dazu auch ne Frage:

    Wenn ich dann ein BMP anklicke gibt er mir auch den pfad zurück. bei einen JPG ist das auch so. Jedoch wenn die dateierweiterung jpg ist - dann krige ich eine zugriffsverletzung etc. woran liegt das? ichj habe das auch im filter geändert aber daran liegt das nicht. der opendialog hat ja rechts ein vorschaufenster - und wenn ich dasn *.jpg anklicke wird das auch net angezeigt sondern sofort kommt die fehlermeldung!

    wäre supi wenn ich das heude noch hinkrige mit den grafiken 😛

    t i m



  • http://www.marquardtnet.info/cecke/tutorials.8/8_jpegviewerl.html

    Standardmäßig kann der C++Builder nut BMP's laden. Für JPG und GIF siehe Link



  • aber da seheich nur quellcode, der irgendwie nix damit zu tun hat. 😞
    das ist ja die routine zum drehen des bildes. aber ich muss ja erstmal ein bild hineinladen können!?

    das ist mein problem! 😞



  • Download Demo-Projekt JPEG-Viewer

    Vielleicht sollte ich den Download des kompletten Demos hervorheben?

    Des Weiteren wird es hier im Forum auch erläutert:

    http://www.c-plusplus.net/forum/viewtopic.php?t=39240



  • hi - komme gerade von mir drüben - habe natürich das demoprogg gezogen.
    jetzt muss ich erstmal alles überflüssige rausballern um zu sehen wie ich eifnach nur das bild bekomme. mehr brauche ich ja nicht!

    zu dem hatte ich auch die suchfunktion genommen - und auch das gefunden aber das bezieht sich aufs speichern - ich will ja ein bild einladen!

    soll auf ne paintbox kommen!
    kann dir mein prog ja mal schicken was ich bisher habe 🙂

    t i m



  • Klar, schicke es vorbei, baue dir das ein



  • dern00b schrieb:

    jetzt muss ich erstmal alles überflüssige rausballern um zu sehen wie ich eifnach nur das bild bekomme. mehr brauche ich ja nicht!

    Ich denke der zweite Link von Christian ist da sehr viel sinnvoller. Da kannst du den Quelltext fast 1:1 rausnehmen.



  • christian - du hast deine mailaddy vergessen^^ 😛

    also:

    #include <jpeg.hpp> 
    #include <gifimage.hpp> 
    
    TJPEGImage *jpg = new TJPEGImage(); 
    
    jpg->Assign(Image1->Picture->Bitmap); 
    jpg->SaveToFile("test.jpg"); 
    Image2->Picture->Assign(jpg); 
    
    delete jpg; 
    
    TGIFImage *gif = new TGIFImage(); 
    
    gif->Assign(Image1->Picture->Bitmap); 
    gif->SaveToFile("test.gif"); 
    Image3->Picture->Assign(gif); 
    
    delete gif;
    

    das ist aber immer saveToFile!

    ich muss das aber loaden.
    dann müsste ich noch sagen, das das max. (ca) 250X250 px haben soll etc... verkleiner wollte ich das dann nicht 😃

    man ist das schwer.

    Frage: Wie bekomme ich das dann auf meine PaintBox?



  • Hallo

    Auf die Idee, das es eine Methode namens LoadFromFile() geben könnte, kommst du nicht?

    bis bald
    akari



  • doch doch - aber ich habe hier keinen bcb und keine hilfe - die idee hatte ich schon!
    das ist alles 80m weit entfernt in meinem hause 😃

    tim



  • Steht auf meiner Homepage unter jeder Seite

    cecke@marquardtnet.info

    Aber nun hast du es ja schon selber raus und hier ist der Rest:

    Graphics::TBitmap *background;
    		TJPEGImage *jpg=new TJPEGImage();
    		jpg->PixelFormat=jf8Bit;
    		jpg->Performance=jpBestQuality;
    		jpg->Smoothing=false;
    		try
    			{
    			jpg->LoadFromFile(DEIN_DATEINAME);
    			}
    		catch(EFOpenError *e)
    			{
    			ShowMessage("Bild nicht vorhanden");
    			return;
    			}
    		background=new Graphics::TBitmap;
    		background->Assign(jpg);
    		delete jpg;
    	if(background->Width>250||background->Height>250)
    			{
    			ShowMessage("Bild nur im Format 250 x 250");
    			return;
    			}
               PaintBox1->Canvas->Draw(0,0,background);
    
    delete background;
    		}
    


  • hallo christian -das sieht ja supi - aus -werde sofort rübergehen und testen!
    aber zu dem vorherigen code habe ich eine zugriffsverletzung! und die verstehe ich nicht:

    __fastcall TForm1::TForm1(TComponent* Owner)
            : TForm(Owner)
    {
     TJPEGImage *jpg = new TJPEGImage();
    }
    
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
     jpg->Assign(Image1->Picture->Bitmap);
    }
    
    void __fastcall TForm1::Button2Click(TObject *Sender)
    {
     Image2->Picture->Assign(jpg);
    }
    

    bei button1click kommt die zugriffsverletzung: WARUM?

    tim



  • Weil jpg im Konstruktor angelegt wurde und dort local ist

    In der Headerdatei unter private des Formulars ein neues Feld aufnehmen:

    TJPEGImage *jpg;

    Dann im Konstruktor

    jpg = new TJPEGImage();

    Dann im Destruktor

    delete jpg;

    Damit kann jpg in der ganzen Klasse benutzt werden



  • richtig....

    ach man das sind so dumme fehler!
    danke - gehe jetzt rüber ne runde proggn.
    P.S. hast ne mail!



  • Hallo

    Belies dich mal zum Thema Gültigkeitsbereich von Variablen und den Unterschied von lokalen und Member-Variablen.

    Da jpg in Button1Click bekannt ist, vermute ich da hast entweder eine globale oder Member-Variable diesen Namens und Typs.
    Im Konstruktor erschaffst du zwar eine Instanz, aber legst die Adresse davon in einen lokalen Pointer, der den gleichnahmigen globalen/Member-Pointer überdeckt. Damit geht sowohl die Adresse als auch die Instanz verloren.

    Also schreib einfach

    jpg = new TJPEGImage();
    

    um den richtigen Pointer zu benutzen.
    Außerdem must du sicherstellen, das alles was du mittels new erstellst, auch mittels delete wieder gelöscht wird (Es gibt Außnahmen, aber nicht in diesem Fall). Benutzt dafür am besten den Destruktor des Forms.

    /Edit : viel zu langsam

    bis bald
    akari



  • 🙂


Anmelden zum Antworten