|
16番会議室「玉石混淆みんなで作るSample蔵」に寄せられたサンプル
"ICON を BITMAP に変換する"
http://www.microsoft.com/win32dev/ui/icons.htm にアイコンのフォーマ
ットの解説があったので、アイコン(File)からビットマップ(Stream)に
変換するコードを書いてみました。
1個のアイコンファイルに複数個のアイコンイメージを入れられる仕様に
なっているようですが、このサンプルコードでは最初の1個だけを変換して
います。
// アイコンファイルをビットマップ形式に変換してストリームに入れる
function IconFileToStreamAsBitmap(Dst: TStream; IconFileName: String):
Boolean;
var
Src: TMemoryStream;
IconDir: PIconDir;
IconImage: PIconImage;
pbih: PBitmapInfoHeader;
Bits: Pointer;
LineSize: Integer;
bfh: TBitmapFileHeader;
begin
if not FileExists(IconFileName) then Exit;
Src := TMemoryStream.Create;
Src.LoadFromFile(IconFileName);
IconDir := Pointer(Integer(Src.Memory) + 0);
// ソースファイルの型チェックが少々手抜きになっています
if (Src.Size > sizeof(TIconDir))
and(IconDir.idReserved = 0)
and(IconDir.idType = 1)
and(IconDir.idCount >= 1)
then
begin
IconImage := Pointer(Integer(Src.Memory)
+ IconDir.idEntries[0].dwImageOffset);
pbih := @(IconImage.icHeader);
pbih.biSize := sizeof(TBitmapInfoHeader);
pbih.biWidth := IconDir.idEntries[0].bWidth;
pbih.biHeight := IconDir.idEntries[0].bHeight;
pbih.biPlanes := 1;
// pbih.biBitCount := IconDir.idEntries[0].wBitCount;
pbih.biCompression := 0;
pbih.biSizeImage := 0;
pbih.biXPelsPerMeter := 0;
pbih.biYPelsPerMeter := 0;
pbih.biClrUsed := IconDir.idEntries[0].bColorCount;
pbih.biClrImportant := 0;
Bits := Pointer(Integer(pbih) + sizeof(TBitmapInfoHeader)
+ (sizeof(TRGBQuad) * pbih.biClrUsed));
LineSize := (pbih.biWidth * pbih.biBitCount + 31) div 4 and -4;
with bfh do
begin
bfType := $4d42;
bfOffBits := sizeof(TBitmapFileHeader)
+ sizeof(TBitmapInfoHeader)
+ sizeof(TRGBQuad) * pbih.biClrUsed;
bfSize := bfOffBits + LineSize * pbih.biHeight;
bfReserved1 := 0;
bfReserved2 := 0;
end;
Dst.Write(bfh, sizeof(bfh));
Dst.Write(pbih^, bfh.bfSize - sizeof(bfh));
end;
Src.Free;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
Stream: TMemoryStream;
begin
if OpenDialog1.Execute then
begin
Stream := TMemoryStream.Create;
// アイコンをビットマップ形式に変換してストリームに入れる
IconFileToStreamAsBitmap(Stream, OpenDialog1.FileName);
// ビットマップファイルとして保存する
Stream.SaveToFile(ChangeFileExt(OpenDialog1.FileName, '.bmp'));
// TImage.Picture.Bitmap に入れる
Stream.Position := 0;
Image1.Picture.Bitmap.LoadFromStream(Stream);
Stream.Free;
end;
end;
以上です。
1998/07/15、河邦 正(GCC02240@niftyserve.or.jp)
Original document by 河邦 正 氏 ID:(GCC02240)
ここにあるドキュメントは NIFTY SERVEの Delphi Users' Forum の16番会議室「玉石混淆みんなで作るSample蔵」に投稿されたサンプルです。これらのサンプルはボーランド株式会社がサポートする公式のものではありません。また、必ずしも動作が検証されているものではありません。これらのサンプルを使用したことに起因するいかなる損害も投稿者、およびフォーラムスタッフはその責めを負いません。使用者のリスクの範疇でご使用下さい。
Copyright 1996-2002 Delphi Users' Forum
|