ImageResizer在大图像开始缩小时出现溢出错误



使用4.2.5版本

我有一个允许用户上传PDF的应用程序,然后将其光栅化到图像流(使用HiQPDF),然后我使用ImageResizer将其缩小。

如果PDF具有非常大的打印尺寸,则栅格化的结果图像非常大(30,000 px x 75,000 px),因此image . build()失败并显示以下错误。

HiQPDF在栅格化过程中没有任何大小缩放选项,所以我有点卡住了。如果有办法解决这个错误,有什么想法吗?

Overflow error.

异常堆栈:

at System.Drawing.Graphics.CheckErrorStatus(Int32 status)
at System.Drawing.Graphics.DrawImage(Image image, PointF[] destPoints, RectangleF srcRect, GraphicsUnit srcUnit, ImageAttributes imageAttr, DrawImageAbort callback, Int32 callbackData)
at System.Drawing.Graphics.DrawImage(Image image, PointF[] destPoints, RectangleF srcRect, GraphicsUnit srcUnit, ImageAttributes imageAttr)
at ImageResizer.ImageBuilder.InternalGraphicsDrawImage(ImageState state, Bitmap dest, Bitmap source, PointF[] targetArea, RectangleF sourceArea, Single[][] colorMatrix)
at ImageResizer.ImageBuilder.RenderImage(ImageState s)
at ImageResizer.ImageBuilder.Render(ImageState s)
at ImageResizer.ImageBuilder.Process(ImageState s)
at ImageResizer.ImageBuilder.BuildJobBitmapToBitmap(ImageJob job, Bitmap source, Boolean transparencySupported)
at ImageResizer.ImageBuilder.BuildJobBitmapToStream(ImageJob job, Bitmap source, Stream dest)
at ImageResizer.ImageBuilder.BuildJob(ImageJob job)
at ImageResizer.ImageBuilder.BuildInternal(ImageJob job)
at ImageResizer.ImageBuilder.BuildInQueue(ImageJob job, Boolean useSemaphore, Int32 maxQueuingMilliseconds, CancellationToken cancel)
at ImageResizer.ImageBuilder.Build(ImageJob job)

相关代码:

string strInstructions = $"maxwidth={maxWidthPixels};maxheight={maxHeightPixels};format=jpg;mode=max;";
strInstructions += "quality=" + ImageSaveQuality + ";";
using (var updatedImageFileStream = new MemoryStream())
{
ImageJob imageJob = new ImageJob(origFileStream, updatedImageFileStream,
new Instructions(strInstructions)
);
imageJob.Build();

您可能已经达到系统的上限。基于绘图的系统

我建议使用ImageResizer替换imagflow。净。它还应该产生更好的压缩文件。

string strInstructions = $"maxwidth={maxWidthPixels};maxheight={maxHeightPixels};format=jpg;mode=max;";
strInstructions += "quality=" + ImageSaveQuality + ";";

using var buildJob = new ImageJob();
var jobResult = await buildJob.BuildCommandString(
new StreamSource(originalStream, true),
new StreamDestination(destStream, true), strInstructions)
.SetSecurityOptions(new SecurityOptions()
.SetMaxDecodeSize(new FrameSizeLimit(80000, 80000, 80000))
.SetMaxEncodeSize(new FrameSizeLimit(80000, 80000, 80000))
.SetMaxFrameSize(new FrameSizeLimit(80000, 80000, 80000)))
.Finish()
.InProcessAsync();

最新更新