Wie greife ich auf ein PNG in einer TImageList zu?



  • Hallo,
    mit dem C++B2009 kann man jetzt auch PNG in eine TImageList einfügen. Das klappt soweit.

    Nur wie kann ich auf ein einzelnes PNG aus dieser Liste zugreifen? Hat jemand Rat? 😕

    ImageList1->GetBitmap(Index, PNG); //Fehler, funktioniert logischerweise nur für BMP
    

    Einen ähnlichen Befehl habe ich für PNG nicht gefunden, leider.



  • Hi,

    das PNG wird intern unkomprimiert in der ImageList abgelegt und als BMP
    im Code aufgerufen:
    Image1 bekommt hier das Bitmap mit Index 0 aus der ImageList zugewiesen:

    ImageList1->GetBitmap(0, (Graphics::TBitmap*) Image1->Picture->Bitmap);
    

    mfg
    kpeter



  • Danke @kpeter,
    mit dem cast kann ich jetzt auf die TImageList mit den PNG's zugreifen. Allerdings verschwindet dann mit der Umwandlung zum TBitmap die Transparenz, die ich ja gerade mit dem PNG-Format erhalten wollte.
    Oder habe ich da etwas übersehen?



  • Hi,

    das ist der andere Thread, nicht...

    Beim erzeugen des Bitmap dort muss du noch was hinzufügen,

    Bitmap->TransparentColor = pBitmap->Canvas->Pixels[0,0];
    

    oder ähnlich

    mfg
    kpeter



  • Hallo @kpeter, danke für Deinen Hinweis auf meine Zusatzfrage

    kpeter schrieb:

    das ist der andere Thread, nicht...

    jjou 😉

    Ich habe Deinen Tipp ausprobiert, leider ohne Erfolg



  • um die Transparenz zu haben muß du die ColorDepth auf cd32Bit stellen



  • s. Thread "BMP verschwunden"



  • huhu,

    ich hab ungefähr ein ähnliches problem, aber ich schaffe es nichtmal ein PNG in die Image Liste dazuzufügen. Ich lese überall nur das es geht, aber nicht wie ^^

    ImageList1->Width=100;
    		ImageList1->Height=150;
    		TPngImage * pngPic =  new TPngImage;
    		ImageList1->ColorDepth = cd32Bit;
    		pngPic->LoadFromFile(L"D:\\masks\\thumbs\\tmpmask_thumb.png");
    		ImageList1->Add(pngPic, pngPic);
    

    das versuche ich gerade, bekomme aber die Fehlermeldung:
    [BCC32 Fehler] Unit1.cpp(28): E2034 Konvertierung von 'TPngImage *' nach 'TBitmap *' nicht möglich
    Vollständiger Parser-Kontext
    Unit1.cpp(17): Analyse: _fastcall TmainView::TmainView(TComponent 😉

    Muss ich das vorher irgendwie von PNG auf BMP casten? oder darf ich nur nicht add verwenden?

    lg leli



  • Der kürzeste Weg ist der über ein Zwischen-Bitmap, in welches das PNG per Assign() geladen wird.

    zB.:

    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
       TPngImage * pngPic 	= new TPngImage;
       pngPic->LoadFromFile("pic1.png");
       Graphics::TBitmap* bmp = new Graphics::TBitmap();
       bmp->Assign(pngPic);
       ImageList1->Clear();
       ImageList1->Height	= bmp->Height;
       ImageList1->Width	= bmp->Width;
    
       ImageList1->Add(bmp, NULL);
       ImageList1->Draw(PaintBox->Canvas, 0, 0, 0);
    
       delete pngPic;
       delete bmp;
    }
    

    Die PNG-Datei enthält u.a. den Bitmap-Header, wonach man auch die Pixeldaten streamen könnte, aber wer es nicht
    so aufwändig will, für den gehts so am schnellsten.

    mfg
    kpeter


Anmelden zum Antworten