お知らせ

電子会議

ライブラリ

パレット

Delphi FAQ検索

Delphi FAQ一覧

サンプル蔵





FDelphi FAQ
16番会議室「玉石混淆みんなで作るSample蔵」に寄せられたサンプル

"RE:ビットマップ→アイコン ファイル変換処"

この発言は
#01134 かとちん さんのビットマップ→アイコン ファイル変換処理
に対するコメントです

この発言に対し以下のコメントが寄せられています
#01144 ぜえた さん 訂正(ビットマップ→アイコン ファイル)

 かとちん さん、こんにちは。 16色のアイコンでも内部では画面の色数になっているのではないでしょうか。 そのために VCLではアイコンをファイルにセーブするとき16色に固定している んだと思います。 したがって、256色のアイコンファイルを作るには、ビットマップから(アイ コンを経由せずに)直接アイコンファイルにするしかないでしょう。 ということで、直接変換するように作ってみました。 Bitmap の Transparentは Trueにしておいてください。 const rc3_StockIcon = 0; rc3_Icon = 1; rc3_Cursor = 2; type PCursorOrIcon = ^TCursorOrIcon; TCursorOrIcon = packed record Reserved: Word; wType: Word; Count: Word; end; PIconRec = ^TIconRec; TIconRec = packed record Width: Byte; Height: Byte; Colors: Word; Planes: Word; BitCount: Word; DIBSize: Longint; DIBOffset: Longint; end; procedure SaveBitmapToStreamAsIcon(Bitmap: TBitmap; Stream: TStream); const CI: TCursorOrIcon = (Reserved: 0; wType: rc3_Icon; Count: 1); MaxBitmapInfoSize = SizeOf(TBitmapInfoHeader) + SizeOf(TRGBQuad) * 256; var ColorInfoSize: Integer; ColorImageSize: Integer; MaskInfoSize: Integer; MaskImageSize: Integer; ColorCount: Integer; Size: Integer; Buf: Pointer; IconRec: PIconRec; ColorInfo: PBitmapInfo; ColorImage: Pointer; MaskImage: Pointer; MaskInfo: array[0..MaxBitmapInfoSize-1] of Byte; begin GetDIBSizes(Bitmap.Handle, ColorInfoSize, ColorImageSize); GetDIBSizes(Bitmap.MaskHandle, MaskInfoSize, MaskImageSize); Size := SizeOf(TCursorOrIcon) + SizeOf(TIconRec) + ColorInfoSize + ColorImageSize + MaskImageSize; Buf := AllocMem(Size); try Integer(IconRec) := Integer(Buf) + SizeOf(TCursorOrIcon); Integer(ColorInfo) := Integer(IconRec) + SizeOf(TIconRec); Integer(ColorImage) := Integer(ColorInfo) + ColorInfoSize; Integer(MaskImage) := Integer(ColorImage) + ColorImageSize; PCursorOrIcon(Buf)^ := CI; GetDIB(Bitmap.Handle, 0, ColorInfo^, ColorImage^); GetDIB(Bitmap.MaskHandle, 0, MaskInfo, MaskImage^); with IconRec^, ColorInfo^.bmiHeader do begin if (biWidth >= 1) and (biWidth < 256) then Width := biWidth; if (biHeight >= 1) and (biHeight < 256) then Height := biHeight; ColorCount := 1 shl (biPlanes * biBitCount); if (ColorCount >= 1) and (ColorCount < 256) then Colors := ColorCount; Planes := biPlanes; BitCount := biBitCount; DIBSize := Size; DIBOffset := SizeOf(TCursorOrIcon) + SizeOf(TIconRec); end; with PBitmapInfoHeader(ColorInfo)^ do biHeight := biHeight * 2; Stream.WriteBuffer(Buf^, Size); finally FreeMem(Buf); end; end; procedure SaveBitmapToFileAsIcon(Bitmap: TBitmap; const FileName: string); var Stream: TStream; begin Stream := TFileStream.Create(FileName, fmCreate); try SaveBitmapToStreamAsIcon(Bitmap, Stream); finally Stream.Free; end; end; //サンプル procedure TForm1.Button1Click(Sender: TObject); var Bitmap: TBitmap; begin Bitmap := TBitmap.Create; try Bitmap.LoadFromFile('C:\Test.bmp'); Bitmap.TransparentMode := tmAuto; Bitmap.Transparent := True; SaveBitmapToFileAsIcon(Bitmap, 'C:\Test.ico'); finally Bitmap.Free; end; end; ぜえた (QZC05100)  Original document by ぜえた 氏 ID:(QZC05100)



ここにあるドキュメントは NIFTY SERVEの Delphi Users' Forum の16番会議室「玉石混淆みんなで作るSample蔵」に投稿されたサンプルです。これらのサンプルはボーランド株式会社がサポートする公式のものではありません。また、必ずしも動作が検証されているものではありません。これらのサンプルを使用したことに起因するいかなる損害も投稿者、およびフォーラムスタッフはその責めを負いません。使用者のリスクの範疇でご使用下さい。

Copyright 1996-2002 Delphi Users' Forum