做了一个单机版的门禁系统,本是要2月份上线的.
可是上次在导入相片的时候,却发生了一个意想不到的问题:5G的硬盘提示空间不足.
800多张没有导入完成竟发生空间不足,请教大家一下,有没有办法在图片存储到数据库的时候进行压缩,
800多个 JPG 文件才10多M,为什么一到数据库就有几G了呢?请大家帮帮忙想想办法?
谢谢了.

解决方案 »

  1.   

    估计导入时还原成BMP格式了,将JPG文件按二进制数组形式储存到数据库中不知可否? :)
      

  2.   

    以二进制流方式存储,而不要使用图片类型字段,虽然图片字段类型相对读取比较方便,但是存在上来说,确实存在空间的浪费,其都以bmp格式存储,当然又不能什么都使用jpeg格式,同样的,如果使用zlib压缩虽然说是比较好,但是那只能是针对非压缩的文件,而针对jpeg格式的图片文件使用zlib再压缩,压缩的效果并不好,并且还存在很大的时间浪费,所以建议有选择的进行压缩和存储处理。
    Zlib API for VB Demo.zip 可以到QQ群:11141442 的共享上面取得。
      

  3.   

    把图片使用zip压缩后再把2进制文件写入数据库,读数据的时候生成zip文件,
      

  4.   

    同意unsigned的意见.因为JPG格式本身就已经是压缩过的,用zlib.dll压缩有可能还会起到相反的,即增大了文件的效果.最好的方法还是按二进制数组的方式储存 (^^;
      

  5.   

    谢谢大家的帮助.
    我是按下面的代码写的,大家看看要怎么修改法.                Dim PBag As New PropertyBag
                    Dim x() As Byte, n() As Byte, iRe As String
                    PBag.WriteProperty "Picture", photoPicture.Picture
                    x() = PBag.Contents
                    rsType.AddNew
                    rsType.Fields("empid") = lsEmpID
                    rsType.Fields("picmax").AppendChunk x()
                    rsType.Fields("Re") = lsRe
                    rsType.Update
    谢谢了.
      

  6.   

    //PBag.WriteProperty "Picture", photoPicture.Picture这句应该是出问题的原因,原因是当保存picturebox的picture时,默认是以bmp格式保存的你可以用debug.print输出一下数组x所占的字节数,如果它和jpg文件大小相差很多的话,就说明这正是问题所在
    解决办法:直接利用IPersistStream接口和IStream接口,根据stdpicture得到byte数组,前提是载入jpg图片后,不要改变picturebox的picture属性(比如,先在picturebox上进行绘图,然后使用set picture1.picture=picture1.image之类的语句,就不能使用这种方法),有关代码可以参考:
    http://community.csdn.net/Expert/topic/4124/4124451.xml?temp=.3227503另外一个思路就是直接根据jpg的文件格式写,用这种方法没有我上面说的限制,但jpg格式比较复杂,不过zyl910已经写出来了,你可以联系它索取代码最后,你也可以从jpg文件直接读出数据到byte数组(这个你应该会吧,比较基础的东东),这个可能会涉及到显示图片的同步问题,由于不知道你为什么用picturebox,所以,这个担心可能是多余的上面的三种方法都是获得byte数组的,而有了byte数组之后,你就可以直接调用AppendChunk了
      

  7.   

    结合大家的建议,问题已经解决.是 Bmp 格式 造成的,谢谢大家了.