TBitpmapから.jpg(TJpegImage)や.png(TPngImage)や.ico(TIcon)や.gif(TGIFImage)ファイルに変換する ~Delphiでお手軽プログラミング

TBitpmapから.jpg(TJpegImage)や.png(TPngImage)や.ico(TIcon)や.gif(TGIFImage)ファイルに変換する ~Delphiでお手軽プログラミング

jpegファイルの作成、透過型PNGファイルの作成、透過型ICONファイルの作成、透過型アニメーションGIFファイルを作成する

TBitmapから.jpg(TJpegImage)ファイルに変換する

以下ソースコードで出来上がった「test.jpg」画像
uses //Vcl.Graphics,
     Vcl.Imaging.jpeg;

procedure TForm1.Button1Click(Sender: TObject);
var bmp:TBitmap;
    jpg:TJpegImage;
begin
  bmp:=TBitmap.Create;
  jpg:=TJPEGImage.Create;
  try
    //Bitmapを塗ったり線を引いたりする
    bmp.width:=64;
    bmp.Height:=64;
    bmp.Canvas.Brush.Color:=clRed;
    bmp.Canvas.FillRect(Rect(10,10,20,20));
    bmp.Canvas.Pen.Color:=clBlack;
    bmp.Canvas.MoveTo(4,4);
    bmp.Canvas.LineTo(60,60);

    //Bitmap画像をjpgに適用する
    jpg.Assign(bmp);
    //JPEGの圧縮品質を80に設定する(1~100まで指定可能)
    jpg.CompressionQuality:=80;
    //JPEG圧縮する
    jpg.Compress;
    //JPEGファイルに保存する
    jpg.SaveToFile('test.jpg');
  finally
    bmp.Free;
    jpg.Free;
  end;
end;

TBitmapから透過型.png(TPngImage)ファイルに変換する

以下ソースコードで出来上がった「test.png」画像
uses //Vcl.Graphics,
     Vcl.Imaging.pngimage;

procedure TForm1.Button2Click(Sender: TObject);
var bmp:TBitmap;
    png:TPngImage;
begin
  bmp:=TBitmap.Create;
  png:=TPngImage.Create;
  try
    //Bitmapに適当に塗ったり線を引いたりする
    bmp.width:=64;
    bmp.Height:=64;
    bmp.Canvas.Brush.Color:=clWhite;
    bmp.Canvas.FillRect(Rect(0,0,bmp.width,bmp.Height));
    bmp.Canvas.Brush.Color:=clRed;
    bmp.Canvas.FillRect(Rect(10,10,20,20));
    bmp.Canvas.Pen.Color:=clBlack;
    bmp.Canvas.MoveTo(4,4);
    bmp.Canvas.LineTo(60,60);
    //白色を透明に設定する
    bmp.TransparentColor:=clWhite;
    bmp.Transparent:=True;

    //Bitmap画像をpngに適用する(透過型PNGになる)
    png.Assign(bmp);
    //PNGファイルに保存する
    png.SaveToFile('test.png');
  finally
    bmp.Free;
    png.Free;
  end;
end;

TBitmapから透過型.ico(TIcon)ファイルに変換する

以下ソースコードで出来上がった「test.ico」画像
//uses Vcl.Graphics;

procedure TForm1.Button3Click(Sender: TObject);
var bmp:TBitmap;
    maskBmp:TBitmap;
    ico:TIcon;
    IconInfo:TIconInfo;
begin
  bmp:=TBitmap.Create;
  maskBmp:=TBitmap.Create;
  ico:=TIcon.Create;
  try
    //Bitmapに適当に塗ったり線を引いたりする
    bmp.width:=64;
    bmp.Height:=64;
    bmp.Canvas.Brush.Color:=clWhite;
    bmp.Canvas.FillRect(Rect(0,0,bmp.width,bmp.Height));
    bmp.Canvas.Brush.Color:=clRed;
    bmp.Canvas.FillRect(Rect(10,10,20,20));
    bmp.Canvas.Pen.Color:=clBlack;
    bmp.Canvas.MoveTo(4,4);
    bmp.Canvas.LineTo(60,60);

    maskBmp.Assign(bmp);
    //左下の色を透過色とする場合
    //maskBmp.Mask(maskBmp.Canvas.Pixels[0,mbmp.Height-1]);
    //白色を透過色とする場合
    maskBmp.Mask($FFFFFF);

    IconInfo.fIcon:=true;
    IconInfo.xHotspot:=0;
    IconInfo.yHotspot:=0;
    IconInfo.hbmMask:=maskBmp.Handle;
    IconInfo.hbmColor:=bmp.Handle;
    ico.Handle:=CreateIconIndirect(IconInfo);
    ico.SaveToFile('test.ico');
  finally
    bmp.Free;
    maskBmp.Free;
    ico.Free;
  end;
end;

TBitmapから透過型アニメーション.gif(TGIFImage)ファイルに変換する

以下ソースコードで出来上がった「test.gif」画像
uses //Vcl.Graphics,
     VCL.Imaging.GIFImg;

procedure TForm1.Button4Click(Sender: TObject);
var bmp:TBitmap;
    gif:TGIFImage;
    gifFrame:TGIFFrame;
    gifGCE:TGIFGraphicControlExtension;
    i:Integer;
    TransparentColor:TColor;
begin
  //透過色
  transparentColor:=$FEFEFE;
  bmp:=TBitmap.Create;
  gif:=TGIFImage.Create;
  try
    bmp.width:=64;
    bmp.Height:=64;
    for i := 0 to 7 do
    begin
      //Bitmapを適当に塗ったり線を引いたりする
      bmp.Canvas.Brush.Color:=TransparentColor;
      bmp.Canvas.FillRect(Rect(0,0,64,64));
      bmp.Canvas.Brush.Color:=clRed;
      bmp.Canvas.FillRect(Rect(i*8,i*8,(i+1)*8,(i+1)*8));
      bmp.Canvas.Pen.Color:=clBlack;
      bmp.Canvas.Pen.Width:=2;
      bmp.Canvas.MoveTo(0,i*8+1);
      bmp.Canvas.LineTo(63,i*8+1);

      gifFrame:=gif.Add(bmp);
      //ループ再生に設定する
      if i=0 then
        TGIFAppExtNSLoop.Create(gifFrame).Loops:=0;
      gif.OptimizeColorMap;
      gifGCE:=TGIFGraphicControlExtension.Create(gifFrame);
      gifGCE.TransparentColor:=TransparentColor;
      gifGCE.Transparent:=True;
      gifGCE.Disposal:=dmBackground;
      gifGCE.Delay:=10;  // 1/100秒単位なので0.1秒/フレーム設定
    end;

    //最適化
    gif.Optimize(
      [TGIFOptimizeOption.ooCrop,
       TGIFOptimizeOption.ooMerge,
       TGIFOptimizeOption.ooCleanup,
       TGIFOptimizeOption.ooColorMap],
      TColorReduction.rmQuantize,
      TDitherMode.dmNearest
    );
    gif.SaveToFile('test.gif');
  finally
    bmp.free;
    gif.Free;
  end;
end;

アニメーション.gif(TGIFImage)ファイルから各フレームをBitmapファイルに取り出す

uses //Vcl.Graphics,
     VCL.Imaging.GIFImg;

procedure TForm1.Button5Click(Sender: TObject);
var gif:TGifImage;
    i:Integer;
    bmp:TBitmap;
    gr:TGIFRenderer;
begin
  gif:=TGIFImage.Create;
  bmp:=TBitmap.Create;
  try
    gif.LoadFromFile('test.gif');
    bmp.Width:=gif.Width;
    bmp.Height:=gif.Height;
    gr:=TGIFRenderer.Create(gif);
    try
      for i := 0 to gif.Images.Count-1 do
      begin
        if not gif.Images[i].Empty then
        begin
          gr.Draw(bmp.Canvas,bmp.Canvas.ClipRect);
          gr.NextFrame;
          bmp.SaveToFile(Format('%2.2d',[i])+'.bmp');
        end;
      end;
    finally
      gr.Free;
    end;
  finally
    bmp.Free;
    gif.Free;
  end;
end;