images für small images schneller erzeugen
-
ich habe eine ListView in dem mehrere einträge stehen und zu
jedem eintrag ein smallImage am anfang der spalte dargestellt ist. die bitmaps schreibe ich in eine ImageList, jedes bitmap ist 10 x 14 pixels groß. die imagList enthält 256 bitmaps, also für jeden grauwert ein bitmap. jedes einzelne bitmap erzeuge ich mit folgendem code:ptr = static_cast<BYTE*>(smallImg->ScanLine[y]); for(int j=0; j < (smallImg->Height * smallImg->Width); j++) { if(x == smallImg->Width) { y++; x = 0; ptr = static_cast<BYTE*>(smallImg->ScanLine[y]); } ptr[x]= i; x++; }nun ist mein problem, dass die erstellung der 256 bitmaps ziemlich lange dauert. weiß jemand wie man die bilder schneller erstellen kann. ich hab mir schon überlegt die bilder abzuspeichern, dann hab ich aber 256 dateien, was nicht gerade ideal ist. meine hoffnung ist dass man die bilder, da sie ja nur einen farbwert haben, mit einer einzigen anweisung erzeugen kann.
vielen dank
mattias
-
mattias schrieb:
ich hab mir schon überlegt die bilder abzuspeichern, dann hab ich aber 256 dateien, was nicht gerade ideal ist.
Hi,
wenn man die Bilder einmal in der ImageList hat, kann man die ursprünglichen Dateien löschen....
Die Bilder werden al Recource im Programm gespeichert...MfG
Alexander Sulfrian
-
DeinBitmap::Canvas::Brush::Color auf den gewünschten Farbwert setzen und den Canvas mit FillRect ausmalen?
-
Alexander Sulfrian schrieb:
wenn man die Bilder einmal in der ImageList hat, kann man die ursprünglichen Dateien löschen....
Die Bilder werden al Recource im Programm gespeichert...wie soll das genau funktionieren, dass die Imagelist als ressource im programm gespeichert wird?
mfg mattias
-
Die Bilder werden al Recource im Programm gespeichert
Das funktioniert nur wenn man die Bilder zur Entwurfszeit der ImageList zuweist.
-
Wie weise ich nun einer ImageList zur Compilezeit Bilder zu?

-
mattias schrieb:
zur Compilezeit
Hi,
was meinst du? Ich kann nur zur Entwurfs- oder Laufzeit der ImageList Bilder zuweisen! (zur Entwurfszeit einfach mit Doppelklick auf die ImageList im Formular)MfG
Alexander Sulfrian
-
Mit Add bzw. Insert!? Aber das müsstest du doch eigentlich schon wissen, sonst hätte dein Code oben doch gar nicht funktioniert (bzw. wäere sinnlos)?
Graphics::TBitmap *bmp = new Graphics::TBitmap(); bmp->PixelFormat = pf24bit; bmp->Width = ImageList1->Width; bmp->Height = ImageList1->Height; for (int i = 255; i >= 0; i--) { bmp->Canvas->Brush->Color = (i << 16)|(i << 8)| i; // Graustufe bmp->Canvas->FillRect(bmp->Canvas->ClipRect); ImageList1->Add(bmp, 0); } delete bmp;
-
alles klar, ich glaubte ihr meint die images in einer ressourcen-datei, so wie bei audiofiles, in einer rc-datei abspeichern. mit dem kenn ich mich leider nicht so aus.
-
Dann mach es doch so, wie Jansen vorschlägt....
Seine Fassung benötigt ca. 20 ms die 256 Bitmaps zu erzeugen. Deine Fassung benötigt ca. 1300 ms...
Ich würde nur diese Zeile ändern (um die Warnung 'TColor wird mit int...' zu beseitigen)
[cpp]bmp->Canvas->Brush->Color = (TColor) (i << 16)|(i << 8)| i; // Graustufe[/cpp]
-
Hier hab ich noch ein Problem, wo ich nicht den Fehler finde. Ich erzeuge eben ein 8 bit Bitmap und will nun die Bilder auf der Festplatte speichern vom Dunklen bis zum Hellen.
for(short i = 0 ; i < 256 ; i++) { Graphics::TBitmap *smallImg = new Graphics::TBitmap(); smallImg->Width = 10; smallImg->Height = 14; smallImg->PixelFormat = pf8bit; unsigned char *ptr; int x=0, y=0; ptr = static_cast<BYTE*>(smallImg->ScanLine[y]); for(int j=0; j < (smallImg->Height * smallImg->Width); j++) { if(x == smallImg->Width) { y++; x = 0; ptr = static_cast<BYTE*>(smallImg->ScanLine[y]); } ptr[x]= (BYTE) i; x++; } smallImg->Palette = grayPal; smallImg->SaveToFile("clusterColor_" + IntToStr(i) + ".bmp"); }Die Palette hab ich mit folgendem Code erzeugt:
LOGPALETTE* pal = NULL; try { pal = (LOGPALETTE*) malloc( sizeof(LOGPALETTE) + sizeof(PALETTEENTRY) * 256); pal->palVersion = 0x300; pal->palNumEntries = 256; for(short i = 0 ; i < 256 ; i++) { pal->palPalEntry[i].peRed = (Byte)i; pal->palPalEntry[i].peGreen = pal->palPalEntry[i].peRed; pal->palPalEntry[i].peBlue = pal->palPalEntry[i].peRed; } grayPal = CreatePalette(pal); } __finally { delete pal; }
-
Noch einmal der Hinweis: Einfacher und schneller als mit Jansens Beispiel kannst Du es nicht haben...
Probleme mit LOGPALETTE gehören m.E. in das WinAPI-Forum. Ich vermute das Problem aber darin, dass Du peFLAGS nicht verwendest.