skia4delphiを使うwebp画像をbmpに変換したり、bmpをwebp画像に変換したり、SVG画像を扱ったり、PDFファイルを作成したりできます。
skia4delniのダウンロードとインストール
https://skia4delphi.org/
から「Download」ボタンをクリックします。
Skia4Delphi_x.x.x_Setup.exe
をクリックしてダウンロードします。
ダウンロードしたファイルを右クリックし、プロパティを左クリックします。
「許可する」にチェックを入れて、「適用」ボタンを押し、「OK」ボタンを押します。
ダウンロードしたファイルをダブルクリックしてインストールを開始します。
sk4d.dllファイルについて
skia4delphiは、Delphiでコンパイルした実行ファイルと同じフォルダ内(もしくはパスの通ったフォルダ内)にsk4d.dllを配置する必要があります。
sk4d.dll(32Bit、64Bit)の場所はインストール先フォルダの以下パスにあります。
・・・\ドキュメント\Skia4Delphi\Binary\Shared\Win32\sk4d.dll
・・・\ドキュメント\Skia4Delphi\Binary\Shared\Win64\sk4d.dll
WEBPファイルをJPEGファイルに変換、JPEGファイルをWEBPファイルに変換する
Button1をクリックするとWEBPファイルをJPEGファイルに変換します。
Button2をクリックするとJPEGファイルをWEBPファイルに変換します。
unit Unit1; interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.ExtCtrls, Vcl.StdCtrls, Skia, Skia.Vcl, Skia.API; type TForm1 = class(TForm) Button1: TButton; Button2: TButton; procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); private { Private 宣言 } public { Public 宣言 } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); var sImg: ISkImage; strm:TMemoryStream; begin //webpファイルをjpegファイルに変換 strm:=TMemoryStream.Create; try sImg:=Skia.TSkImage.MakeFromEncodedFile('image.webp'); // EncodeToStream(ストリーム,画像フォーマット,圧縮品質) sImg.EncodeToStream(strm,Skia.TSkEncodedImageFormat.JPEG,80); strm.SaveToFile('image.jpg'); finally strm.Free; end; end; procedure TForm1.Button2Click(Sender: TObject); var sImg: ISkImage; strm:TMemoryStream; begin //jpegファイルをwebpファイルに変換 strm:=TMemoryStream.Create; try sImg := Skia.TSkImage.MakeFromEncodedFile('image.jpg'); // EncodeToStream(ストリーム,画像フォーマット,圧縮品質) sImg.EncodeToStream(strm,Skia.TSkEncodedImageFormat.WEBP,80); strm.Position:=0; strm.SaveToFile('image.webp'); finally strm.Free; end; end; end.
SVG画像を表示する
Button1をクリックするとSVG画像を表示します。
unit Unit1;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants,
System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.ExtCtrls, Vcl.StdCtrls,
Skia, Skia.Vcl, Skia.API;
type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private 宣言 }
public
{ Public 宣言 }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
var svg: TSkSvg;
begin
svg:=TSksvg.Create(Self);
svg.Parent:=Self;
svg.Left:=400;
svg.top:=0;
svg.Width:=200;
svg.Height:=200;
svg.Svg.Source:=
'<svg style="width:32px;" viewBox="0 0 64 64">'+
'<path d="M40,4 L16,36 L32,36 L24,60 L48,28 L32,28 z"'+
' style="fill:#FF0;stroke:#222;stroke-width:4;'+
'stroke-linecap:round;stroke-linejoin:round;" />'+
'</svg>';
end;
end.
PDFファイルを作成する
Button1をクリックするとPDFファイルを作成します。
SKIAで文字列をPDFファイルに出力する場合、改行コード(#$0d#$0a)を入れても改行されずに四角形が表示されるだけなので注意。
unit Unit1; interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.ExtCtrls, Vcl.StdCtrls, System.Types, system.UITypes, Skia, Skia.Vcl, Skia.API; type TForm1 = class(TForm) Button1: TButton; procedure Button1Click(Sender: TObject); private { Private 宣言 } public { Public 宣言 } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); var LCanvas: ISkCanvas; LDocument: ISkDocument; LDocumentStream: TStream; //LSVGDOM: ISkSVGDOM; sk:ISkImage; LSize: TSizeF; f:ISkFont; paint:ISKPaint; fs:TSkFontStyle; begin //JPEG画像をPDFファイルに出力する場合 sk:=TSkImage.MakeFromEncodedFile('image.jpg'); //ポイント単位で指定する 1pt=1/72 //ミリ単位の場合は A4 210mmx297mm LSize := TSizeF.Create(210*72/25.4, 297*72/25.4); LDocumentStream := TFileStream.Create('output.pdf', fmCreate); try LDocument := TSkDocument.MakePDF(LDocumentStream); try LCanvas := LDocument.BeginPage(LSize.Width, LSize.Height); try fs.Create( TSkFontWeight.ExtraBold, TSkFontWidth.UltraExpanded, TSkFontSlant.Upright ); f:=TSkFont.Create( TSkTypeface.MakeFromName('MS Pゴシック',fs), 24,//サイズ 1, //横スケール 0.5:縦長 2:横倍角 0 //skew ); paint:=TSkPaint.Create; paint.AntiAlias:=true; paint.SetColorF(TAlphaColorF.Create(1,0,0,1)); paint.Style:=TSkPaintStyle.Fill; LCanvas.DrawSimpleText('改行文字を入れても改行されずに',10,30,f,paint); LCanvas.DrawSimpleText('四角形'+#13#10+'が描画されるだけ',10,54,f,paint); //線だけの長方形を描画 paint.SetColorF(TAlphaColorF.Create(0,0.5,0.5,1)); paint.Style:=TSkPaintStyle.Stroke; LCanvas.DrawRect(Rect(10,120,100,200),paint); //JPEG画像をPDFファイルに出力する LCanvas.DrawImageRect(sk,RectF(10,220,110,300)); finally LDocument.EndPage; end; finally LDocument.Close; end; finally LDocumentStream.Free; end; end; end.