我想在网站上阅读PNG文件的原始二进制文件并将其存储到byte []中,到目前为止,我有类似这样的内容:
Uri imageUri = new Uri("http://www.example.com/image.png");
// Create a HttpWebrequest object to the desired URL.
HttpWebRequest imgRequest = (HttpWebRequest)WebRequest.Create(imageUri);
using (HttpWebResponse imgResponse = (HttpWebResponse)imgRequest.GetResponse())
{
using (BinaryReader lxBR = new BinaryReader(imgResponse.GetResponseStream()))
{
using (MemoryStream lxMS = new MemoryStream())
{
lnBuffer = lxBR.ReadBytes(1024);
while (lnBuffer.Length > 0)
{
lxMS.Write(lnBuffer, 0, lnBuffer.Length);
lnBuffer = lxBR.ReadBytes(1024);
}
lnFile = new byte[(int)lxMS.Length];
lxMS.Position = 0;
lxMS.Read(lnFile, 0, lnFile.Length);
}
}
}
但是我不能在Silverlight上使用GetResponse
,因为它不是异步的(我认为这就是原因)所以我应该使用BeginGetResponse
,但我不完全清楚如何去吧。这就是我到目前为止所做的:
HttpWebResponse imgResponse = (HttpWebResponse)imgRequest.BeginGetResponse(new AsyncCallback(WebComplete), imgRequest);
using (imgResponse)
{
using (BinaryReader lxBR = new BinaryReader(imgResponse.GetResponseStream()))
{
/*Same*/
}
}
和
void WebComplete(IAsyncResult a)
{
HttpWebRequest req = (HttpWebRequest)a.AsyncState;
HttpWebResponse res = (HttpWebResponse)req.EndGetResponse(a);
//...? Do I need something else here?
}
有人可以解释一下如何使用BeginGetResponse
属性以及如何使用AsyncCallback。
谢谢!
注意: 我是Silverlight的新手,我一直在关注StackOverflow上的教程并从其他响应中借用: (stackoverflow responce) what I need to do but not in silverlight
这是有效的Silverlight代码吗?
HttpWebResponse imgResponse = (HttpWebResponse)imgRequest.BeginGetResponse(new AsyncCallback(WebComplete), imgRequest);
答案 0 :(得分:4)
让它工作,想在这里发布以防万一有人需要它。
我需要获取此图像然后修改它(字节级别)Silverlight
不允许我将图像直接保存到WriteableBitmap
因此我必须使用WebClient获取图像流然后将其保存到byte[]
这就是我获取图像的方式(我已经有了特定的Uri):
WebClient wc = new WebClient();
wc.OpenReadCompleted += new OpenReadCompletedEventHandler(wc_OpenReadCompleted);
wc.OpenReadAsync(uri)
因此,当加载图像时,会调用wc_OpenReadCompleted
方法,它会执行以下操作:
int lengthInBytes = Convert.ToInt32(e.Result.Length);
BinaryReader br = new BinaryReader(e.Result);
byte[] buffer = new byte[lengthInBytes];
using (br)
{
for (int i = 0; i < lengthInBytes; i++)
{
buffer[i] = br.ReadByte();
}
}
最后buffer[]
包含图像的所有字节(我想要的)
我确信有更好的方法可以做到这一点,但这对我有用! )
注意:在某些时候我需要将byte []转换为BitmapImage(比预期的更容易):
//imageInBytes is a byte[]
if (imageInBytes != null)
{
MemoryStream rawBytesStream = new MemoryStream(imageInBytes);
BitmapImage img = new BitmapImage();
img.SetSource(rawBytesStream);
return img;
}
我希望这对任何人都有帮助。
答案 1 :(得分:1)
使用OpenReadAsync
对象的WebClient
方法。附加到OpenReadCompleted
的{{1}}事件。使用事件参数的WebClient
属性提供的Stream
。
考虑设置Result
,这会在提升AllowReadStreamBuffering
之前填充整个流。无论哪种情况,您都可以使用此流来完成真正的任务,而不是将其复制到MemoryStream中。