求助,silverlight如何显示二进制流图片?

时间:2022-11-12 22:46:41
如,数据库table1表中有PhotoContext字段,该字段为Image类型,就是用来存放图片的二进制。

我在图片上传时,采用将图片转换成二进制存入数据库,现在不知道如何取出来。我在silverlight端采用的是wcf服务来读取

table1表。数据可以取出来,但是返回给silverlight端会报长度超过。

我在web.config中配置如下:

<system.serviceModel>
<behaviors>
<serviceBehaviors>
<behavior name="web.DBServiceBehavior">
<serviceMetadata httpGetEnabled="true"/>
<serviceDebug includeExceptionDetailInFaults="false"/>
</behavior>
</serviceBehaviors>
</behaviors>
<bindings>
<basicHttpBinding>
<binding name="BasicHttpBinding_IDataService" maxBufferPoolSize="2147483647" maxReceivedMessageSize="2147483647" maxBufferSize="2147483647">
<readerQuotas maxArrayLength="2147483647" maxBytesPerRead="2147483647" maxDepth="2147483647" maxNameTableCharCount="2147483647" maxStringContentLength="2147483647"/>
</binding>
</basicHttpBinding>
</bindings>
<serviceHostingEnvironment aspNetCompatibilityEnabled="true"/>
<services>
<service behaviorConfiguration="web.DBServiceBehavior" name="web.DBService">
<endpoint address="" binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_IDataService" contract="web.DBService"/>
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
</service>
</services>
</system.serviceModel>


silverlight端的ServiceReferences.ClientConfig中配置如下:

<configuration>
  <system.serviceModel>
    <bindings>
      <basicHttpBinding>
        <binding name="BasicHttpBinding_DBService" maxBufferSize="2147483647"
          maxReceivedMessageSize="2147483647">
          <security mode="None">
            <transport>
              <extendedProtectionPolicy policyEnforcement="Never" />
            </transport>
          </security>
        </binding>
        <binding name="BasicHttpBinding_DBService1" maxBufferSize="2147483647"
          maxReceivedMessageSize="2147483647">
          <security mode="None">
            <transport>
              <extendedProtectionPolicy policyEnforcement="Never" />
            </transport>
          </security>
        </binding>
      </basicHttpBinding>
    </bindings>
    <client>
      <endpoint address="http://localhost/PhotoManage/DBService.svc"
        binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_DBService"
        contract="DBService.DBService" name="BasicHttpBinding_DBService" />
      <endpoint address="http://longbo/PhotoManage/DBService.svc" binding="basicHttpBinding"
        bindingConfiguration="BasicHttpBinding_DBService1" contract="DBService.DBService"
        name="BasicHttpBinding_DBService1" />
    </client>
  </system.serviceModel>
</configuration>



请问大家有什么办法可以解决过长的问题?并且在silverlight中用BitmapImage来显示图片?

希望能帮忙解决问题,非常感谢。

14 个解决方案

#1


1.首先解决长度超过的问题
【随】WCF传输大数据的设置
虽然可以改变WCF的最大传输设置,但最好还是学学怎么分段传输如下:
Silverlight+WCF文件上传,含分段大小调节(WCF 16KB配置)、压缩Buffer调节、速度指示、批量等 

2.如何显示数据源为Byte[]的图片:

         
        // 摘要:
        //     基于字节数组的指定区域(索引)初始化 System.IO.MemoryStream 类的无法调整大小的新实例。
        //
        // 参数:
        //   buffer:
        //     从中创建该流的无符号字节数组。
        //
        //   index:
        //     buffer 内的索引,流从此处开始。
        //
        //   count:
        //     流的长度(以字节为单位)。
        //
        // 异常:
        //   System.ArgumentNullException:
        //     buffer 为 null。
        //
        //   System.ArgumentOutOfRangeException:
        //     index 或 count 小于零。
        //
        //   System.ArgumentException:
        //     index 与 count 的和大于 buffer 的长度。
        public MemoryStream(byte[] buffer, int index, int count);

        // 摘要:
        //     设置 System.Windows.Media.Imaging.BitmapSource 的源。
        //
        // 参数:
        //   streamSource:
        //     要将源设置为的流。
        public void SetSource(Stream streamSource);



使用上面两个方法来读取Byte[]数据到图片中。

#2


非常感谢,正在看分段传输是怎么实现的。

#3


弄了半天,总算把实现了通过wcf分段传给sl端,但是在sl端还是没办法显示图片,不知道为什么。

我代码这样写的:

BitmapImage bi = new BitmapImage();

bi.SetSource(new MemoryStream(objDataSet));

Image image = new Image();
image.Source = bi;
this.LayoutRoot.Children.Add(image);


到SetSource的时候就报错。不知道是不是分段传输的时候数据丢了还是别的原因,能帮忙解决下吗?感谢

#4


从代码看,可能是图片格式的问题
--当然也可能是数据流错误

#5


估计是数据流的问题,我图片格式是JPG和PNG格式的,没有GIF。

#6


报啥错啊?

#7


引用 3 楼 longboyq 的回复:
弄了半天,总算把实现了通过wcf分段传给sl端,但是在sl端还是没办法显示图片,不知道为什么。

我代码这样写的:

C# code

BitmapImage bi = new BitmapImage();

bi.SetSource(new MemoryStream(objDataSet));

Image image = new Image();
image.Source……


传输字节数正确么?Debug看image

#8


我传输的字节数错了。可能是我实现的方式不对,请教下详细的WCF分段传输方法。谢谢

#9


今天改进了一下WCF分段传输的方法,终于可以显示数据库的图片了。

现在又遇到个问题就是我想将DataSet转成Byte[],分段传给SL端,但是SL端不知道怎么转成List<>。请问大家有什么好的办法吗?

能否将DataSet序列化成string,然后将string转成Byte[],分段传给SL端后再将值转成string后反序列化为List<>。有具体实现的代码吗?

#10


http://ghl68754031.k15.wg8.com/post/27.html

这个可能有帮助

#11


这个问题应该很容易解决,近年春节期间我询问了有关显示数据库中image字段中的图像的方法,网上高手给了我解决办法,等我找到那段代码后发给你。

#12


引用 11 楼 madaming 的回复:
这个问题应该很容易解决,近年春节期间我询问了有关显示数据库中image字段中的图像的方法,网上高手给了我解决办法,等我找到那段代码后发给你。


谢谢,期待啊

#13


引用 10 楼 dancingbeijing_2008 的回复:
http://ghl68754031.k15.wg8.com/post/27.html

这个可能有帮助


显示问题我已经解决了,图片大的话从WCF传到SL端的问题。不知道有没有好的解决方法。

#14


在wcf服务配置的时候选择集合类型就有list型了,

#1


1.首先解决长度超过的问题
【随】WCF传输大数据的设置
虽然可以改变WCF的最大传输设置,但最好还是学学怎么分段传输如下:
Silverlight+WCF文件上传,含分段大小调节(WCF 16KB配置)、压缩Buffer调节、速度指示、批量等 

2.如何显示数据源为Byte[]的图片:

         
        // 摘要:
        //     基于字节数组的指定区域(索引)初始化 System.IO.MemoryStream 类的无法调整大小的新实例。
        //
        // 参数:
        //   buffer:
        //     从中创建该流的无符号字节数组。
        //
        //   index:
        //     buffer 内的索引,流从此处开始。
        //
        //   count:
        //     流的长度(以字节为单位)。
        //
        // 异常:
        //   System.ArgumentNullException:
        //     buffer 为 null。
        //
        //   System.ArgumentOutOfRangeException:
        //     index 或 count 小于零。
        //
        //   System.ArgumentException:
        //     index 与 count 的和大于 buffer 的长度。
        public MemoryStream(byte[] buffer, int index, int count);

        // 摘要:
        //     设置 System.Windows.Media.Imaging.BitmapSource 的源。
        //
        // 参数:
        //   streamSource:
        //     要将源设置为的流。
        public void SetSource(Stream streamSource);



使用上面两个方法来读取Byte[]数据到图片中。

#2


非常感谢,正在看分段传输是怎么实现的。

#3


弄了半天,总算把实现了通过wcf分段传给sl端,但是在sl端还是没办法显示图片,不知道为什么。

我代码这样写的:

BitmapImage bi = new BitmapImage();

bi.SetSource(new MemoryStream(objDataSet));

Image image = new Image();
image.Source = bi;
this.LayoutRoot.Children.Add(image);


到SetSource的时候就报错。不知道是不是分段传输的时候数据丢了还是别的原因,能帮忙解决下吗?感谢

#4


从代码看,可能是图片格式的问题
--当然也可能是数据流错误

#5


估计是数据流的问题,我图片格式是JPG和PNG格式的,没有GIF。

#6


报啥错啊?

#7


引用 3 楼 longboyq 的回复:
弄了半天,总算把实现了通过wcf分段传给sl端,但是在sl端还是没办法显示图片,不知道为什么。

我代码这样写的:

C# code

BitmapImage bi = new BitmapImage();

bi.SetSource(new MemoryStream(objDataSet));

Image image = new Image();
image.Source……


传输字节数正确么?Debug看image

#8


我传输的字节数错了。可能是我实现的方式不对,请教下详细的WCF分段传输方法。谢谢

#9


今天改进了一下WCF分段传输的方法,终于可以显示数据库的图片了。

现在又遇到个问题就是我想将DataSet转成Byte[],分段传给SL端,但是SL端不知道怎么转成List<>。请问大家有什么好的办法吗?

能否将DataSet序列化成string,然后将string转成Byte[],分段传给SL端后再将值转成string后反序列化为List<>。有具体实现的代码吗?

#10


http://ghl68754031.k15.wg8.com/post/27.html

这个可能有帮助

#11


这个问题应该很容易解决,近年春节期间我询问了有关显示数据库中image字段中的图像的方法,网上高手给了我解决办法,等我找到那段代码后发给你。

#12


引用 11 楼 madaming 的回复:
这个问题应该很容易解决,近年春节期间我询问了有关显示数据库中image字段中的图像的方法,网上高手给了我解决办法,等我找到那段代码后发给你。


谢谢,期待啊

#13


引用 10 楼 dancingbeijing_2008 的回复:
http://ghl68754031.k15.wg8.com/post/27.html

这个可能有帮助


显示问题我已经解决了,图片大的话从WCF传到SL端的问题。不知道有没有好的解决方法。

#14


在wcf服务配置的时候选择集合类型就有list型了,