首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >System.Drawing.Image到SkiaSharp

System.Drawing.Image到SkiaSharp
EN

Stack Overflow用户
提问于 2022-11-18 00:16:30
回答 1查看 71关注 0票数 0

我正在尝试将我的代码从使用System.Drawing.Image转移到推荐的这里使用SkiaSharp

我试图为处理流中的Tif文件找到类似的操作。

当前,下面是我使用System.Drawing.Image的内容

代码语言:javascript
运行
复制
System.Drawing.Image MyImage = System.Drawing.Image.FromStream(inStream);
PdfDocument doc = new PdfDocument();

for (int PageIndex = 0; PageIndex < MyImage.GetFrameCount(FrameDimension.Page); PageIndex++)
{
    MyImage.SelectActiveFrame(FrameDimension.Page, PageIndex);
    XImage img = XImage.FromGdiPlusImage(MyImage);
    var page = new PdfPage();

    page.Width = MyImage.Width;
    page.Height = MyImage.Height;
    doc.Pages.Add(page);
    XGraphics xgr = XGraphics.FromPdfPage(doc.Pages[PageIndex]);
    xgr.DrawImage(img, 0, 0, page.Width, page.Height);
}

doc.Save(outStream);
MyImage.Dispose();

我当前使用SkiaSharp的工作如下所示,尽管它不能正确工作。注意:下面的代码有以下错误,除了如何选择活动框架之外,我还试图找出原因:Unhandled exception. System.ObjectDisposedException: Cannot access a closed Stream.可能是SKCodec codec = SkiaSharp.SKCodec.Create(inStream);造成的,但我不知道为什么。

代码语言:javascript
运行
复制
PdfDocument doc = new PdfDocument();
doc.Info.CreationDate = new DateTime();

using MemoryStream inStream = new MemoryStream(data);
using var imgStream = new SKManagedStream(inStream, false);
using var skData = SKData.Create(imgStream);
using SKCodec codec = SKCodec.Create(skData);

// TODO: codec is null!

for (int PageIndex = 0; PageIndex < codec.FrameCount; PageIndex++)
{
    SKImageInfo imageInfo = new SKImageInfo(codec.Info.Width, codec.Info.Height);

    // create bitmap stub
    using SKBitmap skBitmap = new SKBitmap(imageInfo);
    IntPtr pixelsPtr = skBitmap.GetPixels();

    // decode particular frame into the bitmap
    codec.GetPixels(imageInfo, pixelsPtr, new SKCodecOptions(PageIndex));

    // encode bitmap back
    using SKData encodedData = skBitmap.Encode(SKEncodedImageFormat.Png, 100);
    using Stream frameStream = encodedData.AsStream();

    XImage img = XImage.FromStream(frameStream);

    var page = new PdfPage();
    doc.Pages.Add(page);
    XGraphics xgr = XGraphics.FromPdfPage(doc.Pages[PageIndex]);
    xgr.DrawImage(img, 0, 0, page.Width, page.Height);
}
doc.Save(destination);

这些是我尝试过的其他事情:

  • 使用SKCodecOptions来设置FrameIndex,但是我将如何使用它,因为它用于GetPixels()而不是Decode()
  • 我发现,在FrameIndex中没有控制SKBitmap的属性。
  • ImageXImage的额外转换有点混乱,因为从源这里,它似乎是一个直接从Image创建XImage的构造函数。我需要从一个XImage创建一个SkiaSharp.SKBitmap,相反,我认为我当时还不太确定如何做到这一点,比如使用一个现有的方法(比如FromStream() ),尽管我不知道这些使用之间的区别。
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-11-28 08:28:14

您得到了异常,因为用

代码语言:javascript
运行
复制
SkiaSharp.SKBitmap MyImage = SkiaSharp.SKBitmap.Decode(inStream);

处理inStream

无论如何,要使用SkiaSharp获取特定帧,需要从编解码器中获取像素:

代码语言:javascript
运行
复制
using MemoryStream inStream = new MemoryStream(data);
PdfDocument doc = new PdfDocument();
doc.Info.CreationDate = new DateTime();

using SKCodec codec = SkiaSharp.SKCodec.Create(inStream);
for (int PageIndex = 0; PageIndex < codec.FrameCount; PageIndex++)
{
    SKImageInfo imageInfo = new SKImageInfo(codec.Info.Width, codec.Info.Height);

    // create bitmap stub
    using SKBitmap skBitmap = new SKBitmap(imageInfo);
    IntPtr pixelsPtr = skBitmap.GetPixels();

    // decode particular frame into the bitmap
    codec.GetPixels(imageInfo, pixelsPtr, new SKCodecOptions(PageIndex));

    // encode bitmap back
    using SKData encodedData = skBitmap.Encode(SKEncodedImageFormat.Png, 100);
    using Stream frameStream = encodedData.AsStream();

    XImage img = XImage.FromStream(frameStream);

    var page = new PdfPage();

    doc.Pages.Add(page);
    XGraphics xgr = XGraphics.FromPdfPage(doc.Pages[PageIndex]);
    xgr.DrawImage(img, 0, 0, page.Width, page.Height);
}
doc.Save(destination);
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74483613

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档