Bildausschnitt eines BIldes in ein anderes Übertragen



  • Wozu ist das denn hier gut?

    Bild2->Picture->Bitmap=NULL;
    

    Lass das bitte mal weg.



  • Das hab ich shcon rauskommentiert...

    jetzt sieht mein testcode so aus:

    TRect rectSource,rectDest;
    rectSource=Rect(0,0,100,100);
    rectDest=Rect(0,0,100,100);
    Bild2->Canvas->CopyRect(rectDest,Bild1->Canvas,rectSource);
    

    Kommt immernoch fehler!
    Muss ich noch irgendwas vorher mit Bild2 und Bild1 veranstallten?
    Bild 1 is ein TImage was ich auf die Form gezogen habe und ein BIld hinterlegt habe.



  • Geh doch bitte mal mit dem debugger durch und schau nach wo und warum genau der Fehler passiert.
    Was ist denn Bild2?



  • Ist das Bild wirklich ein Bild oder ist es ein Metafile ?



  • Also Bild 1 sowie Bild2 sind TImages.

    TImage *Bild1;
    TImage *Bild2;

    Das Bild1 hab ich im Builder einfach so auf die Form gezogen und dann wird beim Starten der Form ein Bild geladen und Bild1 zugewissen:

    Graphics::TPicture *tempBild=new Graphics::TPicture();
    tempBild->LoadFromFile("MeinBild.jpg");
    Bild1->Picture=tempBild;
    

    So hab ich einen tollen hintergrund...
    Jetzt wollt ich aber gern davon einen Ausschnitt vergrößert darstellen lassen...
    dazu muss ich diesen ausschnitt in ein 2. Bild zwischenspeichern.

    Der Debugger hat niergends angehalten bei dem fehler.. es kommt immer:

    Access violation at address 00477461 in module 'Projekt.exe'. Read of address 00000004C.
    

    😕

    EDIT:

    Fehler kommt keiner mehr! Es lag daran das ich oben net Bild2=new TImage(this); geschrieben habe!
    Da ich aber Bild1 so auf die Form gezogen habe gabs das nich und ich dachte es geht so 🙄

    Also, fehler keiner mehr, aber auch kein Bild! 😮
    Wo is das hin wenn ich das Kopiere??

    rectAusschnitt=Rect(0,0,100,100);
    rectSource=Rect(150,150,250,250);
    Bild2->Width=100;
    Bild2->Height=100;
    Bild2->Picture->Bitmap->Canvas->CopyRect(rectAusschnitt,Bild1->Picture->Bitmap->Canvas,rectSource);
    Form2=new TForm(this)
    Bild2->Parent=Form2;
    

    Sollte doch gehen oder?
    Die Form2 wird natürlichnoch in dergröße geändert und auf visible und so gesetzt...
    die sehe ich ja auch, nur nich das bild! 😮

    komisch? 😕



  • Komponenten zu einem anderen Formular schicken geht glaub ich nicht..

    Dein Bild2 muss sich schon auf Form2 befinden, und dann so weiter:

    [code]
    
    // in form1.cpp : #include form2.h
    // in form2.cpp : #include form1.h
    .
    .
    rectAusschnitt=Rect(0,0,100,100);
    rectSource=Rect(150,150,250,250);
    Form2=new TForm(this);
    Form2->ShowModal();
    Form2->Bild2->Width=100;
    Form2->Bild2->Height=100;
    Form2->Bild2->Picture->Bitmap->Canvas->CopyRect(rectAusschnitt,Bild1->Picture->Bitmap->Canvas,rectSource);
    .
    .
    delete Form2;
    
    [/code]
    

    MfG
    kpeter



  • hmm
    also das scheint genausowenig zu gehen -.-

    is immer noch leer das bild!

    verdammt... wie soll ichs denn noch machen!



  • Wir werden dich mal erlösen, ich poste mal alle 4 Dateien,
    dann siehst du auch, welche Kompo's wo sind.

    Form1 Header:

    //---------------------------------------------------------------------------
    
    #ifndef mainH
    #define mainH
    //---------------------------------------------------------------------------
    #include <Classes.hpp>
    #include <Controls.hpp>
    #include <StdCtrls.hpp>
    #include <Forms.hpp>
    #include <ExtCtrls.hpp>
    #include <jpeg.hpp>
    #include <Buttons.hpp>
    //---------------------------------------------------------------------------
    class TForm1 : public TForm
    {
    __published:	// Von der IDE verwaltete Komponenten
       TImage *Bild1;
       TSpeedButton *sbShowForm2;
       TSpeedButton *sbLoadImage;
       TSpeedButton *sbCopyRect;
       void __fastcall sbShowForm2Click(TObject *Sender);
       void __fastcall sbLoadImageClick(TObject *Sender);
       void __fastcall sbCopyRectClick(TObject *Sender);
       void __fastcall FormCreate(TObject *Sender);
    
    private:
    
    public:
    
       TRect rectSource, rectDest;
       __fastcall TForm1(TComponent* Owner);
    };
    //---------------------------------------------------------------------------
    extern PACKAGE TForm1 *Form1;
    //---------------------------------------------------------------------------
    #endif
    

    Form1 cpp:

    //---------------------------------------------------------------------------
    
    #include <vcl.h>
    #pragma hdrstop
    
    #include "main.h"
    #include "frm2.h"
    #include "jpeg.hpp"  // <=== beachte!
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    #pragma resource "*.dfm"
    TForm1 *Form1;
    //---------------------------------------------------------------------------
    __fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
    {
    }
    //---------------------------------------------------------------------------
    
    void __fastcall TForm1::sbShowForm2Click(TObject *Sender)
    {
       Form2->Show();   // beachte !
    }
    //---------------------------------------------------------------------------
    
    void __fastcall TForm1::sbLoadImageClick(TObject *Sender)
    {
       TJPEGImage *jpegBild = new TJPEGImage();
       try {
          jpegBild->LoadFromFile("MeinBild.jpg");
          Bild1->Picture->Bitmap->Assign(jpegBild);
       }
       __finally {
          delete jpegBild;
       }
    }
    //---------------------------------------------------------------------------
    
    void __fastcall TForm1::sbCopyRectClick(TObject *Sender)
    {
       Form2->Bild2->Canvas->CopyRect(Form2->rectDest,               // wohin copy
                                      Bild1->Picture->Bitmap->Canvas,// woher
                                      rectSource);                   // rect von woher
    }
    //---------------------------------------------------------------------------
    
    void __fastcall TForm1::FormCreate(TObject *Sender)
    {
       rectDest   = Rect (0,   0, 100, 100);
       rectSource = Rect (50, 50, 100, 100);        
    }
    //---------------------------------------------------------------------------
    

    Form2 Header:

    //---------------------------------------------------------------------------
    
    #ifndef frm2H
    #define frm2H
    //---------------------------------------------------------------------------
    #include <Classes.hpp>
    #include <Controls.hpp>
    #include <StdCtrls.hpp>
    #include <Forms.hpp>
    #include <Buttons.hpp>
    #include <ExtCtrls.hpp>
    #include "jpeg.hpp"
    //---------------------------------------------------------------------------
    class TForm2 : public TForm
    {
    __published:	// Von der IDE verwaltete Komponenten
       TImage *Bild2;         // the big target ;)
       TBitBtn *BitBtn1;      // schliessen-button
       void __fastcall FormCreate(TObject *Sender);
    private:
    public:
    
       TRect rectDest;
       __fastcall TForm2(TComponent* Owner);
    };
    //---------------------------------------------------------------------------
    extern PACKAGE TForm2 *Form2;
    //---------------------------------------------------------------------------
    #endif
    

    Form2 cpp:

    //---------------------------------------------------------------------------
    
    #include <vcl.h>
    #pragma hdrstop
    
    #include "frm2.h"
    #include "main.h"
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    #pragma resource "*.dfm"
    TForm2 *Form2;
    //---------------------------------------------------------------------------
    __fastcall TForm2::TForm2(TComponent* Owner)
            : TForm(Owner)
    {
    }
    //---------------------------------------------------------------------------
    
    void __fastcall TForm2::FormCreate(TObject *Sender)
    {
       rectDest = Form1->rectDest;
    }
    //---------------------------------------------------------------------------
    

    Vielleicht spielst du den Fall vorher in einem neuen Projekt durch, da hast du den Kopf frei zum Experimentieren.

    Der Code ist echt simpel.

    Denk dran, dass du die Grösse der zu ladenden Grafiken
    vorher prüfst (falls du andere als dein bekanntes MeinBild nimmst.
    Naja, gibt ev. einen neuen Thread 😃 .

    War ein joke!!

    MfG
    kpeter



  • danke für den Tip!

    Also ich hatte alle deine Hinweise schon drin, aber es ging halt nich!
    Dann hab ich einfahc nochmal alles was damit zu tun hatte gelöscht, neu geschrieben und tada es ging ^^ 🙄
    wer weis wo ich da was vertippt hatte...

    in form2 hab ich bei deactivet noch eingenommen: delete Form2;
    und bei Form1 wenn man auf den Button drückt soll eine neue FOrm2 erstellt werden, da nur so das immage immer den akutellen hintergrund erhalten hat...

    THX nochmal!

    Gibt es jetzt auch noch die möglichkeit den aussschnit in form2 zu vergrößern? 😮

    Edit:
    habs shcon gefunden ^^
    erst auf den canvas malen mit copy rect.
    dann stretch auf true
    und dann die neue größe des bildes mit width und height bestimmen!
    oder?? 😕 😃



  • Das musst du nun selbst herausfinden. "Learning by doing"...

    Im übrigen hab ich nicht gesagt, dass der Code komplett ist.

    Sei mit dem Löschen des Form2 vorsichtig.
    Wenn es in den Projektoptionen unter "automatisch erstellte Formulare" ist, wird es zum Programmende von der Applikation gelöscht.
    Bei Aufruf Form2->Show() kann man mit Form2->Hide() das Form schliessen (verstecken).
    Es bleibt aber im Speicher und ist sofort wieder verfügbar.

    EDIT: Im Ereignis OnShow von Form2 :

    Form2->Refresh();   // oder Form2->Repaint();
    

    Und zu den Schreibfehler kann ich nur sagen, dass die Borland-IDE einen Debugger hat, das Forum hier leider nicht. 🕶

    Na viel Spass.

    MfG
    kpeter


Anmelden zum Antworten