You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修复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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 02:52:06