字节 [ ] 太大而无法转换为 System.Drawing.Image?

Byte[ ] too large to convert to System.Drawing.Image?

我正在尝试从 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 个索引。这种方式太多了吗?有没有更好的方法从网站获取图像?我一直在四处寻找,试图找出答案,现在我来了。

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

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

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

备注:

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

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

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

PDF 文件是矢量文件。 ImageConverter class 似乎无法处理 PDF 文件(从您的 self-answer 判断;PDF 文件比图像多得多,ImageConverter 不尝试转换它们是有道理的)。如果可以,它仍然会从根本上将 PDF 内容从矢量更改为光栅,从而失去可扩展性并可能导致文件更大。

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

代码片段:
XPdfForm form = XPdfForm.FromFile(filename);

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

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

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

虽然这并没有真正回答您标题中的问题,但这是对 PDFsharp 图像 handling/PDF 图像处理的一般建议,您在问题中询问了相关建议。