如何修复Skia4Delphi VCL程序中WebP转TBitmap的‘TSkGraphic无法赋值给TBitmap’错误
修复WebP转TBitmap的"Cannot assign a TSkGraphic to a TBitmap"错误
错误原因
加载WebP图片时,Image1.Picture.Graphic的实际类型是TSkGraphic,而VCL原生的TBitmap.Assign方法不支持直接接收TSkGraphic对象。PNG/JPEG图片加载后会被解析为VCL原生图形类(如TPNGImage、TJPEGImage),这些类与TBitmap有兼容的赋值逻辑,因此不会报错。
解决方案
以下两种方法可实现WebP图片到TBitmap的转换:
方法1:通过Canvas直接绘制
利用TSkGraphic的DrawToCanvas方法,将WebP内容绘制到TBitmap画布:
uses System.Skia, VCL.Skia, VCL.Graphics; var Bitmap: TBitmap; SkGraphic: TSkGraphic; begin Image1.Picture.LoadFromFile('c:\image.webp'); SkGraphic := TSkGraphic(Image1.Picture.Graphic); Bitmap := TBitmap.Create; try Bitmap.SetSize(SkGraphic.Width, SkGraphic.Height); SkGraphic.DrawToCanvas(Bitmap.Canvas, TRectF.Create(0, 0, SkGraphic.Width, SkGraphic.Height)); // 此处可使用转换后的Bitmap finally Bitmap.Free; end; end;
方法2:借助TSkBitmap中转
先将TSkGraphic转换为TSkBitmap,再复制到VCL的TBitmap:
uses System.Skia, VCL.Skia, VCL.Graphics; var Bitmap: TBitmap; SkGraphic: TSkGraphic; SkBitmap: TSkBitmap; begin Image1.Picture.LoadFromFile('c:\image.webp'); SkGraphic := TSkGraphic(Image1.Picture.Graphic); SkBitmap := TSkBitmap.Create; Bitmap := TBitmap.Create; try SkGraphic.EncodeToBitmap(SkBitmap); Bitmap.SetSize(SkBitmap.Width, SkBitmap.Height); SkBitmap.CopyToBitmap(Bitmap); // 此处可使用转换后的Bitmap finally SkBitmap.Free; Bitmap.Free; end; end;
额外优化
为兼容所有图片类型,可添加类型判断,对原生图形类直接使用Assign:
if Image1.Picture.Graphic is TSkGraphic then begin // 执行WebP转换逻辑 end else begin Bitmap.Assign(Image1.Picture.Graphic); end;
内容的提问来源于stack exchange,提问作者Xel Naga
相关产品推荐
相关产品推荐

