Einzelnen Beitrag anzeigen

NickelM

Registriert seit: 22. Jul 2007
Ort: Carlsberg
445 Beiträge
 
Delphi 2009 Professional
 
#5

AW: Bitmap manuel als icon speichern

  Alt 19. Jun 2012, 18:10
Naja mit Bummis Funktion habe ich es so hinbekommen:
Delphi-Quellcode:
var Icon : TIcon;
    Bitmap,TmpBitmap : TBitmap;
    IconInfo : TCursorOrIcon;
    IconRec : TIconRec;
    FileStream : TFileStream;
    BmfInfo : TBitmapInfoHeader;
    MemStream : TMemoryStream;
    X,Y : Integer;
begin
  Bitmap := TBitmap.Create;
  try
    Bitmap.LoadFromFile('C:\Users\Mario\Desktop\test_ico.bmp');
    Bitmap.PixelFormat := pf8bit;
    Icon := BitmapToIcon(Bitmap,32);
  finally
    Bitmap.Free;
  end;
    try
      MemStream := TMemoryStream.Create;
      try
        Icon.SaveToStream(MemStream); //In dem Stream ist aber eine Komplette Ico-Datei inklusive Header
Wenn du, was ich ja vermute, eine Ico-Datei mit mehreren Bitmaps machen willst musst du beide Header überschreiben
        FileStream := TFileStream.Create('C:\Users\Mario\Desktop\test_create.ico',fmCreate);
        try
          FillChar(IconInfo,SizeOf(IconInfo),0);
          IconInfo.wType := RC3_ICON;
          IconInfo.Count := 1;
          FileStream.WriteBuffer(IconInfo,SizeOf(IconInfo));
          FillChar(IconRec,SizeOf(IconRec),0);
          IconRec.Width := 32; //Header Manuel schreiben
          IconRec.Height := 32;
          IconRec.Reserved1 := 1; //Immer 1
          IconRec.Reserved2 := 8; //Pixelformat in Bits
          IconRec.DIBSize := MemStream.Size - SizeOf(IconRec) - SizeOf(IconInfo); //Größe anpassen
          IconRec.DIBOffset := FileStream.Position + SizeOf(IconRec); //Sowie Pos neusetzen
          FileStream.WriteBuffer(IconRec,SizeOf(IconRec)); //Schreiben
          FileStream.Position := IconRec.DIBOffset; //Zur Pos des Bild begins
          FileStream.WriteBuffer(Pointer(Integer(MemStream.Memory) + SizeOf(IconRec) + SizeOf(IconInfo))^,IconRec.DIBSize);
        finally
          FileStream.free;
        end;
      finally
        MemStream.free;
      end;
    finally
      Icon.free;
    end;
end;
EDIT:Sehe schon du hast es, naja aber für die Leute die es "einfacher" haben wollen.
Mann muss natürlich ein bischen umschreiben, wenn man mehrer Header reinschreiben will, aber das denk ich wäre möglich.
EDIT2: @DeddyH : So der Schönheit und der RAM-Memory-Sicherung zuliebe.
Nickel
"Lebe und denke nicht an morgen"
Zitat aus dem gleichnamigen Bollywoodfilm.

Geändert von NickelM (19. Jun 2012 um 19:00 Uhr)
  Mit Zitat antworten Zitat