使用IronPython抓取,C#加载图像

0 投票
2 回答
903 浏览
提问于 2025-04-17 05:13

我写了一个爬虫程序,并把一个C#类(叫做card)传给了IronPython。它很高兴地把我认为是二进制图像数据的内容加载到了一个byte[]数组里,像这样:

imageurl = "http://blabla.com/Image.ashx?id=" + card.Id + "&type=card"
imageresult = urllib2.urlopen(imageurl).read()
if imageresult == '':
    print 'Could not find image for ' + card.Title
card.AddImage(imageresult) # AddImage(byte[])

然后我把这个数据保存下来,并通过NHibernate从数据库中取出来,接着我在我的MVC前端尝试用这个代码来获取数据:

var ms = new MemoryStream(card.Image);
var image = Image.FromStream(ms); // ***Parameter is not valid.***

如果我当初直接把数据写入文件,而不是用Python处理成C#对象,我相信这样就能正常工作了。我的问题是,有没有好的方法可以了解IronPython和CLR数据类型之间的转换会是什么样的?我对二进制数据不太了解,所以在这种情况下我有点不知道该怎么做。

2 个回答

0

DrNewman 说得很对。问题出在从 IronPython 输出的字符串格式上。与其在 Python 中把它转换成正确的格式,然后再用 C# 带回来,我决定把这部分交给 C# 来处理。我做的就是从 IronPython 调用 AddImage 方法,然后直接传递网址。最后一步的抓取(就是图片)则用 C# 来完成。

1

看起来 byte[] 这个东西不能被保存。你可以看看这个问题:

NHibernate 的 MappingException:没有 byte[] 的持久化器

可能你看到的错误信息不一样,因为这个问题发生在 IronPython 中,而不是 C#,这是因为 C# 有类型检查。

这里有另一个链接,提供了一种可能的解决办法,就是把 byte[] 转换成 ASCII 格式来保存:

http://guildsocial.web703.discountasp.net/dasblogce/2009/04/03/NHibernateMappingToBinaryData.aspx

这是那篇文章中的一段代码:

return new ASCIIEncoding().GetString(bytes);

public static string ConvertByteArrayToString(byte[] bytes)
{
    try
    {
        return new ASCIIEncoding().GetString(bytes);
    }
    catch (Exception)
    {
        return "";
    }

}

撰写回答