加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ruby-on-rails – 使用gzip压缩将图像数据编码为UTF-8字符串

发布时间:2020-12-17 02:37:19 所属栏目:百科 来源:网络整理
导读:我试图将文件中的图像数据作为base64字符串存储到PostgreSQL数据库中,该字符串由gzip压缩以节省空间.我使用以下代码对图像进行编码: @file = File.open("#{Rails.root.to_s}/public/" @ad_object.image_url).read@base64 = Base64.encode64(@file)@compress
我试图将文件中的图像数据作为base64字符串存储到PostgreSQL数据库中,该字符串由gzip压缩以节省空间.我使用以下代码对图像进行编码:

@file = File.open("#{Rails.root.to_s}/public/" << @ad_object.image_url).read
@base64 = Base64.encode64(@file)
@compressed = ActiveSupport::Gzip.compress(@base64)
@compressed.force_encoding('UTF-8')
@ad_object.imageData = @compressed

当我尝试保存对象时,出现以下错误:

ActiveRecord::StatementInvalid (PG::Error: ERROR:  invalid byte sequence for encoding "UTF8": 0x8b

在rails控制台中,任何gzip压缩都将输出数据作为ASCII 8-BIT编码.我试图将我的内部和外部编码设置为UTF-8,但结果没有改变.如何将此压缩数据转换为UTF-8字符串?

解决方法

出于多种原因,这没有多大意义.

> gzip是二进制编码.由于输出是二进制的而base64仅用于通过非8位清除协议进行传输,因此绝对没有基本64位编码的东西然后gzipping它.直接gzip文件.
>大多数图像数据已经使用像PNG或JPEG这样的编解码器压缩,在压缩图像数据方面比gzip更有效.对它进行Gzipping通常会使图像略大一些. Gzip对于图像数据永远不会像loss-les PNG格式那样高效,因此如果您的图像数据未压缩,PNG会压缩它而不是压缩它.
>表示二进制数据时,实际上并不存在文本编码问题,因为它不是文本.它不会是有效的utf-8,并试图告诉系统它只会导致进一步的问题.

完全使用base64编码和gzip步骤.由于mu太短,所以只需使用Rails二进制字段,让Rails处理二进制数据的编码和发送.

只需在数据库中使用bytea字段并直接存储PNG或JPEG图像.它们在线路上进行十六进制编码以进行传输,占用二进制空间的2倍,但它们以二进制形式存储在磁盘上.如果PostgreSQL受益于压缩,它会自动压缩磁盘上的bytea字段,但大多数图像数据都不会.

要最小化图像的大小,请选择适当的压缩格式,如PNG用于无损压缩或JPEG用于照片.在压缩之前尽可能地对图像进行下采样,并使用产生可接受质量的最强压缩(对于像JPEG这样的有损编解码器).不要试图用gzip / LZMA /等进一步压缩图像,它什么都不会实现.

当通过线路传输十六进制传输时,您仍然会将数据大小翻倍.解决这个问题需要使用PostgreSQL二进制协议(困难和复杂)或二进制清洁边带来传输图像数据.如果Pg gem支持SSL压缩,您可以使用它来压缩协议流量,这将大大降低十六进制转发的成本.

如果需要将大小保持在绝对最小值,我就不会使用PotsgreSQL有线协议将图像发送到设备.它的性能和可靠性设计超过了最小尺寸.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读