お知らせ

電子会議

ライブラリ

パレット

Delphi FAQ検索

Delphi FAQ一覧

サンプル蔵





FDelphi FAQ
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