Bild als Icon speichern
-
Wie muß ich ein Icon (*.ico) speichern?
Wenn ich es im TImage geladen hab und unter neuem Namen speicher, kann von keinem Programm der Header gelesen werden.
Wenn ich im TImage zB. ein Bild 32x32x256(oder 16) erstell und dann als *.ico speicher, sagt die eigene App beim Wiederöffnen "ungültiges Symbol". Der Viewer stellt fest, daß es ein *.bmp mit falscher Erweiterung ist. Nach dem Umbenennen ist es ein einwandfreies .bmp.
Speicher ich via
Image->Picture->Icon->SaveToFile(SaveDialog->FileName);
bekomm ich die Meldung "ungültiges Symbol". Hilfe und Suchfunktion scheinen mich im Stich zu lassen - was ich aber eigentlich nicht glauben mag.
Was muß ich tun, damit es klappt? Wer kann mir einen Tip geben?
-
rate mal wozu es TIcon gibt und Assign()...
-
TIcon ist klar. Aber Assign()? Vielleicht, wenn ich ein ICO öffne und unbearbeitet wieder speicher? - Man muß ja erst mal einen Ansatz finden.
-- Aber ich rate nicht gern, @Sunday, ich nehm lieber die Artillerie.
:
Image->Picture->Icon->LoadFromFile(OpenDialog->FileName); ... ... Graphics::TIcon *Ico = new Graphics::TIcon(); if (SaveDialog->Execute()) { Ico->Assign(Image->Picture->Icon); Ico->SaveToFile(SaveDialog->FileName); }
Die letzte Zeile bringt ein "Ungültiges Symbol". - Ich hätte allenfalls ein leeres Ico erwartet, da das Öffnen bestimmt so nicht richtig war.
Und dabei hab ich das Teilchen noch nicht bearbeitet. - Ein Ico wird offenbar anders bearbeitet als ein BMP, ich kann es nicht bearbeiten.
Aber wenn ich ein Bitmap hab, wollte ich das als ICO speichern können.
Image->Picture->Icon.AssignTo...? - Hab keine Vorstellung, wie ich das Thema angehen könnte.
-
Original erstellt von Sunday:
rate mal wozu es TIcon gibt und Assign()...Nicht hierfür!
@<Omega-X>: Du musst dein Bitmap in ein Icon konvertieren. Das geht wie folgt:
TIcon* __fastcall BitmapToIcon(Graphics::TBitmap* bmp, TColor clTransparent) { if(bmp->Width<=32 && bmp->Height<=32) { int pixels; if(bmp->Width==16 && bmp->Height==16) pixels = 16; else if(bmp->Width==32 && bmp->Height==32) pixels = 32; else return NULL; Graphics::TBitmap* NewBmp = new Graphics::TBitmap; TImageList* List = new TImageList(Application); TIcon* icn = new TIcon; List->Height = pixels; List->Width = pixels; NewBmp->Width = pixels; NewBmp->Height = pixels; NewBmp->Canvas->StretchDraw(NewBmp->Canvas->ClipRect, bmp); List->AddMasked(NewBmp, clTransparent); List->GetIcon(0, icn); delete NewBmp; delete List; return icn; } else return NULL; }
-
@WebFritzi, damit hast du mir 'ne Riesenfreude gemacht, ich dank dir sehr. Der Weg ist einfach genial, da wär ich noch sehr lange nicht draufgekommen - wen überhaupt.
-Aber ich könnt' mich im Grab rumdrehen, es gelingt mir einfach nicht, solche Funktionen (mit Graphics::TBitmap *bmp) aufzurufen.
Nach dem Speichern wieder ein Bitmap zum Weiterarbeiten ins TImage zu bekommen, war dagegen 'ne leichte Übung.
Hier mal meinen Einsteigerversion. Hoffentlich trifft dich beim Lesen nicht der Schlag?
:
void __fastcall TPixi::SaveAsIco(TObject *Sender) { if(Image->Width<=48 && Image->Height<=48) { int pixels; if(Image->Width==16 && Image->Height==16) pixels = 16; else if(Image->Width==32 && Image->Height==32) pixels = 32; else if(Image->Width==48 && Image->Height==48) pixels = 48; else pixels = 0; if (pixels != 0) { Graphics::TBitmap* NewBmp = new Graphics::TBitmap; TImageList* List = new TImageList(Application); icn = new TIcon; List->Height = pixels; List->Width = pixels; NewBmp->Width = pixels; NewBmp->Height = pixels; NewBmp->Canvas->StretchDraw(NewBmp->Canvas->ClipRect, Image->Picture->Graphic); List->AddMasked(NewBmp, clTransparent); List->GetIcon(0, icn); delete List; icn->SaveToFile(SaveDialog->FileName); Image->Picture->Assign(NewBmp); delete NewBmp; } else { ShowMessage("Ungültige Symbolgröße.\nBild konnte nicht gespeichert werden."); return; } } }
Der Rest war 'ne große ergebnislose Knobelkur: Ich find keine Methode, die es ermöglicht, aus einem ICO ein Bitmap zu machen. Selbst wenn ein Weg zu passen scheint, verweigert der Compiler. Aber das muß definitiv sein, wenn man ein ICO zum bearbeiten öffnen will. Was oder wer kann mir weiterhelfen?
-
Hi ihr.....
Das kannst du doch genauso machen, wie du das Bitmap auch zu nem Icon machst,
halt nur "andersherum"......
Also so in etwa:TIcon *ico = new TIcon; ico->LoadFromFile ( "D:\\Icon.ico" ); TImageList *list = new TImageList ( this ); list->Height = ico->Height; list->Width = ico->Width; list->AddIcon ( ico ); Graphics::TBitmap *bmp = new Graphics::TBitmap; bmp->Height = ico->Height; bmp->Width = ico->Width; list->GetBitmap ( 0, bmp ); delete ico; delete list; delete bmp;
Also das hat bei funktioniert..... (Transparenz und Stretchen erstmal nicht
mitbedacht, aber das dürfte ja dann auch nicht so schwer sein ?!? )MFG Aoeke
[ Dieser Beitrag wurde am 15.04.2003 um 15:39 Uhr von Aoeke editiert. ]
-
hier das hab ich in der hilfe zu TIcon gefunden!!!
Dieses Beispiel konvertiert ein Symbol (.ICO) in ein Bitmap. Um dieses Beispiel auszuführen, muß das Formular ein Bild, eine Schaltfläche und ein Öffnen-Dialogfeld enthalten. Geben Sie der Schaltfläche den Namen ConvertIcon2Bitmap und fügen Sie zu deren Ereignisbehandlungsroutine OnClick den folgenden Code hinzu.
void __fastcall TForm1::Button1Click(TObject *Sender) { OpenDialog1->DefaultExt = ".ICO"; OpenDialog1->Filter = "Symbole (*.ico)|*.ICO"; OpenDialog1->Options << ofOverwritePrompt << ofFileMustExist << ofHideReadOnly; if (OpenDialog1->Execute()) { TIcon *pi = new TIcon(); try { AnsiString as; pi->LoadFromFile(OpenDialog1->FileName); as = ChangeFileExt(OpenDialog1->FileName,".BMP"); Image1->Width = pi->Width; Image1->Height = pi->Height; Image1->Canvas->Draw(0,0,pi); Image1->Picture->SaveToFile(as); ShowMessage(OpenDialog1->FileName + " Gespeichert auf " + as); } __finally { delete pi; } } }
[ Dieser Beitrag wurde am 15.04.2003 um 15:52 Uhr von Sunday editiert. ]
-
Oder auch einfach kurz und kompakt:
Graphics::TBitmap* IconToBitmap(TIcon* icn) { Graphics::TBitmap* bmp = new Graphics::TBitmap(); bmp->Width = icn->Width; bmp->Height = icn->Height; bmp->Canvas->Draw(0,0,icn); return bmp; }
-
*Booo*, da kann ich lange knobeln. Wozu konvertieren, wenn die Canvas Draw'en kann? - So einfach hätt ich das nicht erwartet - . Bin euch sehr dankbar.
@Aoeke, nach der Hilfe sollen ICON und Metafile immer transparent sein. Ich merx nur nix davon.
Vielleicht geht es in den neueren BCB-Versionen? - Aber in einer richtigen Anwendung kann man die Transparentfarbe bestimmen. Via API muß es möglich sein...
@WebFritzi hat in seinem Beispiel ja clTransparent drin. Nutzlos macht er sowas nicht. Ich muß noch mal mit Ruhe expirimentieren. - ... Ich glaub schon, daß ich die Funktionen aufrufen kann. Was nützt ein bmp, wenn es nicht mit new initialisiert wurde? *Oh_ich_Nili_mit_der_dünnen_Scheibe*
Aber @WebFritzi, das Teilchen belegt zur Laufzeit permanent Speicher. Es wird sicher sinnvoll sein, solche Funktionen so abzuschließen:
bmp->Width = 1;
bmp->Height = 1;
Oder lieg ich falsch?Ole, mal abgesehen von der Transparenz, mein Code war noch falsch aufgebaut. Damit alles richtig laufen kann, sieht es im Auszug so aus:
void __fastcall TPixi::Open(TObject *Sender) { Image->AutoSize = true; ... if (ExtractFileExt(OpenDialog->FileName).LowerCase() == ".ico") { TIcon *icn = new TIcon(); icn->LoadFromFile(OpenDialog->FileName); Image->Width = icn->Width; Image->Height = icn->Height; Image->Picture->Graphic->Width = icn->Width; Image->Picture->Graphic->Height = icn->Height; Image->Canvas->Draw(0,0,icn); delete icn; } ImgOriWidth = Image->Width; // für Zoomfaktorberechnung ImgOriHeight = Image->Height; // dto. Image->AutoSize = false; BildModified = false; VergrBox->ItemIndex=0; // 100% ZFac = 1; FormResize(Sender); // Bild zentrieren SetCaption(Sender); BitmapHandleType(Sender); // DDB, alles flutscht wesentlich besser } //--------------------------------------------------------------------------- void __fastcall TPixi::SaveAsIco(TObject *Sender) { int pixels; if(Image->Picture->Graphic->Width==16 && Image->Picture->Graphic->Height==16) pixels = 16; else if(Image->Picture->Graphic->Width==32 && Image->Picture->Graphic->Height==32) pixels = 32; else if(Image->Picture->Graphic->Width==48 && Image->Picture->Graphic->Height==48) pixels = 48; else pixels = 0; if (Image->Picture->Graphic->Width<=48 && Image->Picture->Graphic->Height<=48 && pixels != 0) { Graphics::TBitmap* NewBmp = new Graphics::TBitmap; TImageList* List = new TImageList(Application); icn = new TIcon; List->Height = pixels; List->Width = pixels; NewBmp->Width = pixels; NewBmp->Height = pixels; NewBmp->Canvas->StretchDraw(NewBmp->Canvas->ClipRect, Image->Picture->Graphic); List->AddMasked(NewBmp, clTransparent); List->GetIcon(0, icn); delete List; icn->SaveToFile(SaveDialog->FileName); Image->Picture->Assign(NewBmp); delete NewBmp; } else { SDOK = false; // verhindert Aktionen im else-Fall ShowMessage("Ungültige Symbolgröße.\n\nBild konnte nicht gespeichert werden."); return; } }
Dann hätt ich noch 'ne Caption-Frage (PixelFormat). Außerdem muß ich das PixelFormat der ArbeitsBitmap zuweisen. PixelFormat bei TIcon? Aber die Teilchen haben auch ein Speicherformat. Weiß jemand, wie man das auslesen kann?