【问题标题】:Byte[ ] too large to convert to System.Drawing.Image?Byte[ ] 太大而无法转换为 System.Drawing.Image?
【发布时间】:2017-05-07 10:24:03
【问题描述】:

我正在尝试从Byte[] 中保存Image,但我不断被ArgumentException : Parameter is not valid 踢出。我想知道Byte[] 是否太大而无法转换。有限制吗?

代码:

private XImage[] GetImagesFromURL(List<string> lstCutSheetURLs)
{
    int itr = lstCutSheetURLs.Count;
    XImage[] m_imgCutSheets = new XImage[itr];

    using (var webClient = new WebClient())
    {
        for (int i = 0; i < itr; i++)
        {
            var imageBytes = webClient.DownloadData(lstCutSheetURLs[i]);
            if (imageBytes != null && imageBytes.Length > 0)
            {
                MemoryStream ms = new MemoryStream();
                ImageConverter converter = new ImageConverter();

                //
                //THIS IS WHERE IT BREAKS EVERY TIME
                Image img = (Image)converter.ConvertFrom(imageBytes);
                //

                img.Save(ms, System.Drawing.Imaging.ImageFormat.Png);
                m_imgCutSheets[i] = XImage.FromStream(ms);
            }
        }
    }

    return m_imgCutSheets;
}

Byte[] 最终拥有 458,330 个索引。这样是不是太多了?有没有更好的方法从网站获取图像?我一直在四处寻找,试图找出答案,现在我在这里。

非常感谢任何文章/建议/答案!谢谢。

【问题讨论】:

  • 这适用于较小的图像吗?
  • 哪一行报错
  • @Trey 此行下方://THIS IS WHERE IT BREAKS EVERY TIME.
  • @rhughes - 我不知道。我的任务是从网站上提取图像,因此所有源都设置为执行和解决该问题。没有尝试过任何其他图像。相反,我应该说我在测试期间只使用来自一个特定网站的一张特定图像。
  • 等一下,你把 PDF 的 byte[] 扔到 ImageConverter 上,对吗?

标签: c# arrays image converter pdfsharp


【解决方案1】:

PDF 文件是矢量文件。 ImageConverter 类似乎无法处理 PDF 文件(从您的自我回答来看;PDF 文件不仅仅是图像,而且 ImageConverter 不会尝试转换它们是有道理的)。如果可以,它仍然会从根本上将 PDF 内容从矢量更改为光栅,从而失去可扩展性并可能导致文件更大。

将页面从一个 PDF 文件添加到另一个文件的最佳方法是使用 XPdfForm 类。您可以在对DrawImage 的调用中使用表单对象,就像将光栅图像绘制到 PDF 中一样。

代码 sn-p:
XPdfForm form = XPdfForm.FromFile(filename);

PDFsharp 网站上的示例代码:
http://pdfsharp.net/wiki/TwoPagesOnOne-sample.ashx

JPG 文件是您的代码应该处理的另一种特殊情况。将 JPG 转换为 PNG 是可能的,但没有任何意义。 PNG是一种无损格式,JPG有损失,但会大大减小文件大小。在大多数情况下,从 JPG 转换为 PNG 会导致带有 JPEG 伪影的更大文件。

恕我直言,可以将ImageConverter 用于除 PDF 和 JPG 之外的其他类型。查看文件是否完整可能是一个很好的验证。
由于XImage.FromStream 可以处理多种图像格式(PNG、BMP、GIF、TIFF、JPG),这可能不会真正添加验证之外的功能。

虽然这并不能真正回答您标题中的问题,但这是关于 PDFsharp 图像处理/PDF 图像处理的一般建议,您在问题中要求提供相关建议。

【讨论】:

    【解决方案2】:

    事实证明,ImageConverter 将处理多少个索引以创建System.Drawing.Image 是有限制的(至少在我的测试中没有)。

    但是,似乎没有格式限制。我试图从网上检索.pdf 文件,将它们存储在我的byte[] 中,然后将它们放在Image 变量中。尽管我成功检索了.pdf,但转换器似乎无法识别数组内容的格式。

    注意事项:

    1. 我检索到的原始 .pdf 创建了一个包含 458,330 的数组 索引,不会通过转换器处理。
    2. 我检索到的 .png 创建了一个包含 4,054 个索引 的数组,并且 正确处理。
    3. 然后使用第二个 .pdf,创建一个包含 7,945 个索引的数组, 并且不会通过转换器进行处理。
    4. 最后,使用了 .jpg,创建了一个包含 2,769,747 的数组 索引,并且处理正确

    由于这些结果,我认为问题在于所使用的文件类型 - 而不是文件的大小。

    我还没有找到解决这个问题的方法,但是当我找到时,我会编辑这个答案以反映它,以供有需要的人参考。

    【讨论】:

      猜你喜欢
      • 2020-02-09
      • 1970-01-01
      • 2020-07-03
      • 1970-01-01
      • 2021-04-25
      • 1970-01-01
      • 2022-01-24
      • 2015-11-02
      • 2016-01-29
      相关资源
      最近更新 更多