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(TComponentMuss 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