字节 [ ] 太大而无法转换为 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
,但转换器似乎无法识别数组内容的格式。
备注:
- 原来
.pdf
我检索创建了一个数组458,330
indices 并且不会通过转换器进行处理。
- 我检索到的
.png
创建了一个包含 4,054 个索引 的数组,并且
正确处理。
- 然后使用了第二个
.pdf
,创建了一个包含 7,945 个索引 的数组,
并且不会通过转换器进行处理。
- 最后用了一个
.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 图像处理的一般建议,您在问题中询问了相关建议。
我正在尝试从 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
,但转换器似乎无法识别数组内容的格式。
备注:
- 原来
.pdf
我检索创建了一个数组458,330 indices 并且不会通过转换器进行处理。 - 我检索到的
.png
创建了一个包含 4,054 个索引 的数组,并且 正确处理。 - 然后使用了第二个
.pdf
,创建了一个包含 7,945 个索引 的数组, 并且不会通过转换器进行处理。 - 最后用了一个
.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 图像处理的一般建议,您在问题中询问了相关建议。