Search code examples
c#imagefileclassfilestream

How to download an image URL to switch to byte [] up and read it WP8 C#


for (int i = 3; i < 10; i++)
{
    Uri uriimg = new Uri("http://i.msdn.microsoft.com/dynimg/IC53593" + i + ".jpg", UriKind.RelativeOrAbsolute);
    SaveToLocalStorage(ImageToArray(uriimg), "anh1.jpg");
}

private byte[] ImagesToArray(Uri uriimg)
{
    var image = new BitmapImage(uriimg);
    MemoryStream ms = new MemoryStream();
    image.ImageOpened += (s, e) =>
    {
        image.CreateOptions = BitmapCreateOptions.None;
        WriteableBitmap wb = new WriteableBitmap(image);
        wb.SaveJpeg(ms, image.PixelWidth, image.PixelHeight, 0, 100);
    };
    return ms.ToArray();
}

public async void SaveToLocalStorage(byte[] _imageBytes, string fileName)
{
    if (_imageBytes == null)
    {
        return;
    }
    var isoFile = IsolatedStorageFile.GetUserStoreForApplication();
    if (!isoFile.DirectoryExists("dataImages"))
    {
        isoFile.CreateDirectory("dataImages");
    }
    string filePath = System.IO.Path.Combine("dataImages", fileName);
    using (var stream = isoFile.CreateFile(filePath))
    {
        await stream.WriteAsync(_imageBytes, 0, _imageBytes.Length);
    }
}

public ImageSource LoadFromLocalStorage(string fileName)
{
    var isoFile = IsolatedStorageFile.GetUserStoreForApplication();
    ImageSource imageSource = null;
    if (isoFile.DirectoryExists("dataImages"))
    {
        string filePath = System.IO.Path.Combine("dataImages", fileName);
        using (var imageStream = isoFile.OpenFile(filePath, FileMode.Open, FileAccess.Read))
        {
            imageSource = PictureDecoder.DecodeJpeg(imageStream);
        }
    }
    return imageSource;
}

I get the value as byte [0] it can not convert to byte [].


Solution

  • The problem I see is in ImagesToArray. You create a new MemoryStream, subscribe to an event that sets it, and then immediately return it. I'm pretty sure that ms will have 0 bytes when it is returned.

    You should instead not use image.ImageOpened, and just put that code in the ImagesToArray method directly:

    private byte[] ImagesToArray(Uri uriimg)
    {
        var image = new BitmapImage(uriimg);
        MemoryStream ms = new MemoryStream();
    
        image.CreateOptions = BitmapCreateOptions.None;
        WriteableBitmap wb = new WriteableBitmap(image);
        wb.SaveJpeg(ms, image.PixelWidth, image.PixelHeight, 0, 100);
    
        return ms.ToArray();
    }