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

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

概述我试图将文件中的图像数据作为base64字符串存储到PostgreSQL数据库中,该字符串由gzip压缩以节省空间.我使用以下代码对图像进行编码: @file = File.open("#{Rails.root.to_s}/public/" << @ad_object.image_url).read@base64 = Base64.encode64(@file)@compressed = Ac 我试图将文件中的图像数据作为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有线协议将图像发送到设备.它的性能和可靠性设计超过了最小尺寸.

总结

以上是内存溢出为你收集整理的ruby-on-rails – 使用gzip压缩将图像数据编码为UTF-8字符串全部内容,希望文章能够帮你解决ruby-on-rails – 使用gzip压缩将图像数据编码为UTF-8字符串所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1280967.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-09
下一篇 2022-06-09

发表评论

登录后才能评论

评论列表(0条)

保存