我正在尝试将我的代码从使用System.Drawing.Image
转移到推荐的这里使用SkiaSharp
。
我试图为处理流中的Tif文件找到类似的操作。
当前,下面是我使用System.Drawing.Image
的内容
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);
造成的,但我不知道为什么。
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);
这些是我尝试过的其他事情:
FrameIndex
,但是我将如何使用它,因为它用于GetPixels()
而不是Decode()
。FrameIndex
中没有控制SKBitmap
的属性。Image
到XImage
的额外转换有点混乱,因为从源这里,它似乎是一个直接从Image
创建XImage
的构造函数。我需要从一个XImage
创建一个SkiaSharp.SKBitmap
,相反,我认为我当时还不太确定如何做到这一点,比如使用一个现有的方法(比如FromStream()
),尽管我不知道这些使用之间的区别。发布于 2022-11-28 08:28:14
您得到了异常,因为用
SkiaSharp.SKBitmap MyImage = SkiaSharp.SKBitmap.Decode(inStream);
处理inStream
。
无论如何,要使用SkiaSharp获取特定帧,需要从编解码器中获取像素:
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);
https://stackoverflow.com/questions/74483613
复制相似问题