Abfragen von Farbe eines Bitmaps auf einem TImage



  • Hallo,

    in der FAQ für den BCB hab ich folgendes gefunden: Grafik - Pfad/Typ von Image->Picture ermitteln?

    Ok, aufgrund dieser Basis weiß ich jetzt schonmal das ich den Dateinamen nicht herausfinden kann 😞
    Gibt es wenigstens eine Möglichkeit herauszufinden, welche Farbe das Bitmap,
    welches auf meiner TImage-Komponente liegt, hat? Oder habt ihr einen besseren
    Vorschlag um herauszufinden, welches Bitmap auf welcher TImage-Komponente liegt?!

    Mit ScanLine hab ich schon rumprobiert, aber das hat gleich überhaupt
    nicht funktioniert.

    Die Bitmaps sind alle einfarbige Kreise, welche auf einem TImage-Quadrat liegen.

    Sollte ich bei der Suche einen Thread übersehen haben, der das gleiche Thema behandelt...habt einfach nur Mitleid mit mir 😉

    [ Dieser Beitrag wurde am 29.04.2003 um 15:29 Uhr von Jansen editiert. ]



  • Mit GetPixel() kannst du dir die Farbe eines Pixels holen.

    "herauszufinden, welches Bitmap auf welcher TImage-Komponente liegt"

    Warum würdest du das herausfinden wollen? Schliesslich hast du (bzw. dein Programm) das Bild doch in das Image geladen, also solltest du (bzw. dein Programm) auch wissen, welches Bild geladen wurde!?



  • Ich habe das Bild in auf die TImage-Komponente geladen, soweit so gut.
    Dann weise ich per Drag&Drop die Eigenschaften der TImage-Komponente einer
    anderen TImage-Komponente zu.

    Da ich bei der Komponente (der die Eigenschaften zugewiesen wurde) auf den Namen der Bilddatei dann nicht mehr zugreifen kann (siehe Zitat 1. Beitrag), kann ich eben nicht mehr nachvollziehen, welches Bild geladen wurde.

    War das verständlich? 😕

    [ Dieser Beitrag wurde am 29.04.2003 um 16:26 Uhr von Schorschi editiert. ]



  • Aber irgendwann musst du das Bild aus dem Image doch ein erstes Mal laden,
    warum schreibst du den Namen der Datei dann nicht gleich in eine Variable?
    ( Weiß jetzt nicht ob ich was falsch verstanden habe... )

    MFG Aoeke



  • Original erstellt von Schorschi:
    Da ich bei der Komponente (der die Eigenschaften zugewiesen wurde) auf den Namen der Bilddatei dann nicht mehr zugreifen kann (siehe Zitat 1. Beitrag), kann ich eben nicht mehr nachvollziehen, welches Bild geladen wurde.

    Aber du weisst ja, welches Image auf welches gezogen wurde. Über diese Verschiebungen musst du halt selbst "Buch führen", zB. mittels zusätzlicher Variablen, wie von Aoke erwähnt.



  • Ich habe den Namen bereits in einem Array stehen.
    Kurze Erklärung (dürfe jemanden bekannt vorkommen):

    Es gibt acht TImage-Komponenten (Spielsteine) ,die auf vier andere TImage-Komponenten (Ablagefelder) gezogen werden können.
    Dabei ist es völlig egal, ob der Dritte der acht Spielsteine auf das
    2. oder 4. Ablagefeld gezogen wird. Und hier ist mein Problem. Da ich nicht
    nachvollziehen kann welcher der Spielsteine worauf gelegt worden ist, kann ich
    auch nicht prüfen 😞

    Super wäre es wenn ich jedes Ablagefeld so einfach prüfen könnte wie es im
    ersten Codebeispiel aus einem anderen Thread codiert worden ist (siehe erster
    Thread).

    Selbst Buch führen...hmmm. Wüsste jetzt grad nicht wie ihr das meint. Ich hab
    den Sender, Source, X, und Y als Drag&Drop-Parameter.
    Hier mein Code:

    void __fastcall TForm1::ablageFlaechenDragDrop(TObject *Sender, TObject *Source, int X, intY)
    {
        ((TImage *) Sender)->Picture->Bitmap = ((TImage *) Source)->Picture->Bitmap;
    }
    

    Steh ich aufm Schlauch?



  • Gib in der Tag-Eigensachaft jedes Images die Nummer des Bitmaps an. Aktualisiere, wenn das Bitmap geändert wird.



  • Bau dir doch 'ne Klasse:

    class PACKAGE TNamedImage: public TImage
    {
    public:
      AnsiString FileName;
      void __fastcall LoadFromFile(AnsiString FN);
    }
    
    void __fastcall TNamedImage::LoadFromFile(AnsiString FN)
    {
      try
      {
        Picture->LoadFromFile(FN);
        FileName=FN;// wenn Laden OK!
      }
      catch(...)
      {
        FileName="";// falls Ladefehler!
      }
    }
    

    Wenn Du die Klasse anstelle von TImage nimmst, wird der Dateiname dauerhaft gespeichert!!!
    Den Name kannste mit NamedImage1->FileName jederzeit wieder abfragen!!!

    PS: Das ist nur 'n Ansatz!!!
    Besser ist, FileName privat machen und mit 'ner Property zugreifen!!!



  • Erstmal Danke für eure Mühe.
    Der Tipp mit dem Tag scheint mir am einfachsten, da dieser wenig Aufwand erfordert.
    Als Tag habe ich einen Index zugewiesen, den ich jetzt gerne wieder auslesen
    möchte. Mein Code dazu sieht so aus:

    int tmpTag = (*ablageFlaeche[zeile][spalte]).Tag;
    

    Das Zuweisen war kein Problem, nur das Auslesen des Wertes bringt mir immer
    eine Exception: EAccessViolation...Lesen von Adresse xxx

    In der Hilfe dazu steht:
    __property int Tag = {read=FTag, write=FTag, default=0};

    Leutet mir überhaupt nicht ein warum das nicht geht 😕
    In der FAQ habe ich gerade nachgeschaut, aber leider nix gefunden 😞

    Any hints?



  • Hallo,

    Das wird wohl nicht am Tag liegen, sondern an deiner Variable ablageFlaeche.
    Was für einen Typ hat die denn. Vielleicht sind auch die Indizes falsch etc.
    Mal abgesehen davon, warum machst du so ein komisches Konstrukt. Auf Member von Pointern greift man über -> zu.
    Also:

    int tmpTag = ablageFlaeche[zeile][spalte]->Tag;
    

    Ciao



  • Ok, wie man es schreibt ist ja egal, geht beides.
    Das Array ist vom Typ TImage, am Index kann es nicht liegen, weil ich es schon
    mit festen Werten probiert habe.

    Die Höhe, Breite und den DragMode kann ich aber auch ohne Probleme zuweisen,
    nur diese eine **** Eigenschaft sträubt sich 😡

    Ich werd nochmal alles durchgehen, vielleicht liegt es wirklich nur am Array...



  • Jetzt bin ich immer noch nicht weitergekommen 😞
    Es bleibt mir wohl nix anderes übrig als meinen Code zu posten...

    Definition im Headerfile:

    //--------------------
    //Ausserhalb der Klasse
    //--------------------
    const int anzahlZeilen  = 10;
    const int anzahlSpalten = 4;
    
    //--------------------
    class TForm1 : public TForm
    {
    .
    .
    .
    private:    // Anwender-Deklarationen
    
    int aktuelleZeile;
    TImage *ablageFlaeche[anzahlZeilen][anzahlSpalten];
    TImage *spielstein[anzahlSpielsteine];
    
    bool __fastcall pruefeObSteineGesetzt(int aktuelleZeile);
    };
    

    Definition des Ablagefeldes

    TImage *ablageFlaeche[anzahlZeilen][anzahlSpalten] =
       {
             {imgZ1S1, imgZ1S2, imgZ1S3, imgZ1S4},     // Zeile 1
             {imgZ2S1, imgZ2S2, imgZ2S3, imgZ2S4},     // Zeile 2
             {imgZ3S1, imgZ3S2, imgZ3S3, imgZ3S4},
             {imgZ4S1, imgZ4S2, imgZ4S3, imgZ4S4},
             {imgZ5S1, imgZ5S2, imgZ5S3, imgZ5S4},     //....
             {imgZ6S1, imgZ6S2, imgZ6S3, imgZ6S4},
             {imgZ7S1, imgZ7S2, imgZ7S3, imgZ7S4},
             {imgZ8S1, imgZ8S2, imgZ8S3, imgZ8S4},
             {imgZ9S1, imgZ9S2, imgZ9S3, imgZ9S4},
             {imgZ10S1, imgZ10S2, imgZ10S3, imgZ10S4} // Zeile 10
       };
    

    Und zum Schluss noch meine nicht funktionierende Funktion:

    bool __fastcall TForm1::pruefeObSteineGesetzt(int aktuelleZeile)
    {
         int  tmpTag = 0;
    
         for (int aktuelleSpalte = 0; aktuelleSpalte < anzahlSpalten; aktuelleSpalte++)
         {        
    
             tmpTag = this->ablageFlaeche[aktuelleZeile][aktuelleSpalte]->Tag;
    
             // Muss einen Wert zwischen 0 und 7 haben...
             if ( (tmpTag < 0) || (tmpTag > 7) )
             {
                ShowMessage("Nicht alle Steine gesetzt!");
                return false;
             }
         }
    
         return true
    }
    

    Die Fehlermeldung:
    E2208 Auf inaktiven Bereich kann nicht zugegriffen werden.

    Das Element auf das ich zugreifen will ist aber nicht deaktiviert (Enabled = true)!
    Werte kann ich ja schließlich zuweisen, nur abrufen eben nicht!!



  • Hi....
    Also ich bin mir nicht sicher, aber muss man nicht erst, wenn man ein Image oder
    sonst was dynamisch erstellt, das ding mit Blablabla = new TBlablabla ( ... )
    also in deinem Fall alle Images mit new erstellen? Vielleicht hast du es ja auch
    schon, ich weiß ja nicht....
    Wenn ich hier jetzt gerade Schwachsinn erzählt habe... Sorry... Bin mir
    halt nicht sicher....

    MFG Aoeke

    [ Dieser Beitrag wurde am 02.05.2003 um 14:34 Uhr von Aoeke editiert. ]



  • Mit

    new
    

    kann ich es nicht deklarieren, da spuckt der Compiler einen Error aus.
    Trotzdem danke für Deine Mühe!

    [ Dieser Beitrag wurde am 05.05.2003 um 09:06 Uhr von Schorschi editiert. ]



  • Also ich weiß ja nicht, wie du es gemacht hast, aber folgender Code läuft bei
    mir fehlerlos...

    TImage *img[4][4];
        for ( int a = 0; a < 4; a++ )
        {
            for ( int b = 0; b < 4; b++ )
            {
                img[a][b] = new TImage ( Form1 );
            }
        }
        ShowMessage ( "done" );
        for ( int a = 0; a < 4; a++ )
        {
            delete img[a][0];
            delete img[a][1];
            delete img[a][2];
            delete img[a][3];
        }
    

    Kleine Zwischenfrage, wenn ich den Array jetzt so lösche, ist der dann komplett
    weg, oder muss man ( solche ) Arrays anders löschen ( wie? ) ?

    MFG Aoeke



  • Wenn man Form1 bei new übergibt, dann klappts also.
    Ich habs so probiert:

    TImage *img = new TImage[4][4];
    

    Bei mir läuft das aber so ähnlich.
    Ich werds am Montag in der Arbeit mal ausprobieren, hab den Code gerade nicht
    vollständig zur Hand.
    Ich kann ja mit "meinem Array" ganz normal Arbeit, bis eben auf das Auslesen der Tag-Eigenschaft...
    Besten Dank derweil 🙂



  • Guten Morgen allerseits,

    das Problem war, dass ich einen Zeiger definiert, aber keinen Speicher mit
    new allokiert habe.

    @Aoeke: Dank deines Codebeispiels bin ich dann drauf gekommen das ich dies vergessen hatte. Dir gebührt ein Extralob!
    Löschen tut man ein Array übrigens so:

    delete [] img;
    

    @all: Danke für eure Hilfe!

    [ Dieser Beitrag wurde am 05.05.2003 um 09:35 Uhr von Schorschi editiert. ]


Anmelden zum Antworten