如何在 Windows Phone 8.1 上从数据库中获取图像并将其显示为字节数组

Posted

技术标签:

【中文标题】如何在 Windows Phone 8.1 上从数据库中获取图像并将其显示为字节数组【英文标题】:How to get and display image as byte array from database on Windows Phone 8.1 【发布时间】:2016-11-06 02:29:05 【问题描述】:

我想使用本地 WCF 服务从数据库中获取图像作为字节数组,并使用图像控件将其显示在页面上。我无法让它工作。

这是开始时最简单的代码……最终我想在 XAML 中使用绑定。

//I use following code for getting bytes (it’ s working)
private async Task GetPhotoAsync(string code)
    
        using (var httpClient = new HttpClient())
        
            using (var request = new HttpRequestMessage(HttpMethod.Get,
                $"http://192.168.0.5/Service/TerminalService.svc/GetPhoto?Code=code"))
            
                using (var response = await httpClient.SendAsync(request))
                
                    if (response.IsSuccessStatusCode)
                    
                        ImageBuffer = (await response.Content.ReadAsByteArrayAsync());
                    
                    else
                    
                        throw new Exception($"Error.Environment.NewLineresponse");
                    
                
            
        
    

...

public byte[] ImageBuffer
    
        get  return _imageBuffer; 
        set  SetProperty(ref imageBuffer, value); 
    

public class BindableObject : INotifyPropertyChanged

    public event PropertyChangedEventHandler PropertyChanged;
    protected bool SetProperty<T>(ref T storage, T value, [CallerMemberName] String propertyName = null)
    
        if (object.Equals(storage, value)) return false;
        storage = value;
        this.OnPropertyChanged(propertyName);
        return true;
    
    protected void OnPropertyChanged([CallerMemberName] string propertyName = null)
    
        var eventHandler = this.PropertyChanged;
        if (eventHandler != null) eventHandler(this, new PropertyChangedEventArgs(propertyName));
    

...

//Method used to convert bytes into BitmapImage and set source of control Image.

public async void SetImageFromByteArray(byte[] data, Image image)
    
        using (InMemoryRandomAccessStream raStream = new InMemoryRandomAccessStream())
        
            using (DataWriter writer = new DataWriter(raStream))
            
                // Write the bytes to the stream
                writer.WriteBytes(data);

                // Store the bytes to the MemoryStream
                await writer.StoreAsync();

                // Not necessary, but do it anyway
                await writer.FlushAsync();

                // Detach from the Memory stream so we don't close it
                writer.DetachStream();
            

            raStream.Seek(0);

            BitmapImage bitMapImage = new BitmapImage();
            bitMapImage.SetSource(raStream);

            image.Source = bitMapImage;
        
    

加载 MainPage 时,我运行 GetPhotoAsync() 方法。 过了一会儿,我通过按下按钮设置 Image.Source 并运行方法 SetImageFromByteArray()。 什么都没有显示。

我也尝试了这些解决方案但没有成功:

具有绑定属性 - https://marcominerva.wordpress.com/2013/04/15/how-to-convert-a-byte-array-to-image-in-a-windows-store-app/ 使用转换器- Windows Phone 8 - Load byte[] array into XAML image with Binding TaskCompletionNotifier - Async Implementation of IValueConverter

【问题讨论】:

你是否在模型中实现了 INotifyPropertyChanged 接口 是的,我做到了。我已经编辑了我的问题。 【参考方案1】:

你可以试试这个,它对我有用。

首先,您必须在将 Image 控件绑定到的 ViewModel 中设置属性。

public BitmapImage ImageSource 
     
        get  return _imageSource;  
        set  SetProperty(ref _imageSource, value);  
    

...

public async Task GetPhotoAsync(string twrKod)
    
        using (var httpClient = new HttpClient())
        
            using (var request = new HttpRequestMessage(HttpMethod.Get,
                $"http://192.168.0.5/Service/TerminalService.svc/GetPhoto?Code=code"))
            
                using (var response = await httpClient.SendAsync(request))
                
                    if (response.IsSuccessStatusCode)
                    
                        var imageStream = await response.Content.ReadAsStreamAsync();

                        var memStream = new MemoryStream();
                        await imageStream.CopyToAsync(memStream);
                        memStream.Position = 0;
                        var bitmap = new BitmapImage();
                        bitmap.SetSource(memStream.AsRandomAccessStream())
                        ImageSource = bitmap;
                    

                
            
        
    

确保您有 MemoryStream 作为 WCF 服务的返回类型。例如:

public Stream GetPhoto(string code)
   
        byte[] bytes = null;
        var myCommand = new SqlCommand())
        myCommand.Connection = new SqlConnection(Settings.Default.ConnectionString);
        objSql.ObjCommand.CommandText = "dbo.GetPhotoProc";
        objSql.ObjCommand.CommandType = CommandType.StoredProcedure;
        objSql.ObjCommand.Parameters.Add("@code", SqlDbType.NVarChar).Value = code;

        objSql.Reader = objSql.ObjCommand.ExecuteReader();

        if (!objSql.Reader.HasRows) return null;
        while (objSql.Reader.Read())
        
            bytes = (byte[])objSql.Reader.GetValue(0);
        
        if (bytes == null) return Stream.Null;
        var ms = new MemoryStream(bytes)  Position = 0 ;

        if (WebOperationContext.Current != null)
            WebOperationContext.Current.OutgoingResponse.ContentType = "image/jpeg";
        return ms;
    

WCF 接口

[WebGet(UriTemplate = "GetPhoto?Code=code", RequestFormat = WebMessageFormat.Xml, ResponseFormat = WebMessageFormat.Xml, BodyStyle = WebMessageBodyStyle.Bare)]
    [OperationContract]
    Stream GetPhoto(string code);

【讨论】:

以上是关于如何在 Windows Phone 8.1 上从数据库中获取图像并将其显示为字节数组的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Windows phone silverlight 应用程序上从 C# 填充视频

如何将 Windows 商店中的 Windows Phone 应用程序(8.1 XAML)迁移到 8.1 Silverlight?

我如何采取截图编程中的Windows Phone 8.1

如何在 Windows Phone 8.1 / Windows 10 上创建自定义 VirtualizingPanel?

如何填充文本框-Windows Phone 8.1

如何在 windows phone 8.1 中检查文件夹是不是为空