当前位置:首页 > 未来畅想 > 正文内容

getattributevalue 不损质量?Rails下的图像处理

getattributevalue 不损质量?Rails下的图像处理

图像可以说是任何应用至关重要的一部分。从社交网络到一个简单的Bug追踪器,图像都扮演着重要的角色。然而管理图像并不是一件容易的事情,需要提前耗费大量的时间精力去计划。

本文演示了如何在Rail中实现这一目标。如何处理你的图像以及在后台创建多个版本?如何通过压缩图像又不损图像质量,以此来提高页面性能?这些且听本文一一道来。

入门

本文教程是运行于Rails 4.2,通过数据库和HAML呈现视图。不过本文所展示的片段应该兼容任何Rails版本(尽管有些配置差异)。

布置舞台

是一套功能强大、稳定而且开源的工具集和开发包,你可以通过包管理把它安装在你的电脑上。

上:

sudo apt-get -y install imagemagick
sudo apt-get -y install libmagic-dev
sudo apt-get -y install libmagickwand-dev

Mac OS X上,建议使用自制程序:

brew install imagemagick

现在我们需要一个连接到本地库的Ruby适配器。你可以使用getattributevalue 不损质量?Rails下的图像处理,因为它是轻量级的:

# Gemfile
 
gem 'mini_magick'

的特性

在正式开始之前,让我们先了解一下某些的特性,以避免不必要的错误。

打开Rails控制台(Rails c)并运行以下代码:

# Open an image from a website
 
image = MiniMagick::Image.open("https://s3.amazonaws.com/StartupStockPhotos/20140808_StartupStockPhotos/85.jpg")
 
# Get the Image's width
image.width # 4928
 
# Get the image's height
image.height #3264

让我们调整一下以适应我们的iPad:

image.resize "2048x1536"
 
# Now get the image's new width and height
 
p "Width is => #{image.width} and height is => #{image.height}"

更改后的文件存储在哪呢?

image.path # temp path

操纵图像存储到一个临时的路径有消失的危险。所以要把它放到磁盘中getattributevalue,一个简单的调用编写方法如下:

image.write "public/uploads/test.jpg"

转换图像

或许你最常见的工作之一就是将图像转换成不同的格式。可以简化这一过程:

image.format "png"
image.write "public/uploads/test.png"

你还可以将多个操作放在同一模块中:

image.combine_options do |i|
  i.resize "2048x1536"
  i.flip
  i.rotate "-45"
  i.blur "0x15"
end
image.write "public/uploads/blur.png"
 
![Some weird result](blur.png)

至此getattributevalue,让我们来看看如何将以上的这些与我们的Rails应用联系到一起。

上传文件

简化了在Ruby中上传文件,同时它与交互的也很好。

# Gemfile
 
gem 'carrierwave'

getattributevalue 不损质量?Rails下的图像处理 第1张

gem 'carrierwave-mongoid', :require => 'carrierwave/mongoid'

注意:如果你是在或上getattributevalue 不损质量?Rails下的图像处理,配置会稍微不同。官方文档介绍了正确的方法,点此进入。

获取:

bundle install

创建第一个上传:

#app/uploaders/image_uploader.rb
 
class ImageUploader < CarrierWave::Uploader::Base
  # Include RMagick or MiniMagick support:
  include CarrierWave::MiniMagick
 
  # Choose what kind of storage to use for this Uploader:
  storage :file
  # Override the directory where uploaded files will be stored.
  # This is a sensible default for uploaders that are meant to be mounted:
  def store_dir
    "uploads/images"
  end
end

这段代码是自说明getattributevalue, :file指示服务器将图像存储在本地服务器上,指定位置。

自从文件通过互联网传送,总会过滤传入的文件:

# app/uploaders/image_uploader.rb
...
# Add a white list of extensions which are allowed to be uploaded.
# For images you might use something like this:
def extension_white_list
  %w(jpg jpeg png gif)
end
...

将这种上传置入我们的图像模型:

# app/models/image.rb
 
class Image
  include Mongoid::Document
  include Mongoid::Timestamps
  include Mongoid::Paranoia
  include Mongoid::Attributes::Dynamic
  include Rails.application.routes.url_helpers
 
  mount_uploader :media, ImageUploader, mount_on: :media_filename
end

编辑.rb来处理上传的图像:

# app/uploaders/image_uploader.rb
 
#.....
process :resize_to_fill => [200, 200]
process :convert => 'png'
#.....

尝试从Rails控制台创建一个新的图像:

media = File.open("/Users/test/Desktop/image/jpg")
img = Image.new(:media => media)
img.save

上传图像在下是可用的。然而上传的图像是立即被处理的,并被200×200的图像覆盖。我们没有原始文件的副本留作以后编辑。所以为避免这种情况,我们需要创建多个版本的文件。

# app/uploaders/image_uploader.rb
 
#.....
version :thumb do
  process :resize_to_fit => [100, 100]
  process :convert => 'jpg'
end
 

getattributevalue 不损质量?Rails下的图像处理 第2张

version :cover do process :resize_to_fit => [240, 180] process :convert => 'jpg' end #.....

下面显示的是上段代码创建两个版本,检查版本由创建:

img.media.versions[:thumb] # returns the thumb image instance
img.media.versions[:cover] # returns the cover image instance

你注意到这些图像是瞬间生成的吗?这意味着图像转换发生在同一线程中,并且执行是被阻塞的,直到完成为止。在生产应用中,在同一线程里创建一个图像的多个版本是不受欢迎的。相反,我们应该有条件的处理这种情况。

# app/uploaders/image_uploader/rb
 
#....
version :cover, :if => :is_live? do
  process :resize_to_fit => [240, 180]
  process :convert => 'jpg'
end
 
def is_live?(img = nil)
  @is_live
end
 
def is_live=(value)
  @is_live = value
end
#....

这样,当我们创建一个新的图像时,副本将不会生成。我们可以在需要的时候手动去触发,运行如下代码:

img.media.is_live = true
img.save
img.media.recreate_versions! :cover

这代码也是运行于前台,是一个阻塞操作,但至少可以尽可能的推迟到最后一刻。我们可以通过在后台进一步的运行:

# lib/resque/image_queue.rb
class ImageQueue
  @queue = :image_queue
  def self.perform(image_id)
    image = Image.find image_id
    img.media.is_live= true
    img.save
    img.media.recreate_versions! :cover
  end
end

然后,列队:

Resque.enqueue(ImageQueue, img.id.to_s)

性能提升

图像是厚重的,往往会减慢网站。减少页面负担的一种方法是压缩这些图像。图像优化器可以帮助我们飞速的压缩图像。

将下面这段添加到:

gem 'carrierwave-imageoptimizer'

然后编辑:

# app/uploaders/image_uploader.rd
 
#.....
 
include CarrierWave::ImageOptimizer
process :optimize
process :quality => 100
#....

如此压缩不会有视觉丧失。

图像处理是一个巨大的垂直,我们几乎只触及表面。我们可以建立很多很酷的东西。如果您对这篇文章感兴趣,请在评论中分享您的想法。

加入微信交流群:************ ,请猛戳这里→点击入群

扫描二维码推送至手机访问。

版权声明:本文由前沿科技娱乐汇发布,如需转载请注明出处。

本文链接:https://kejiyl.com/post/4689.html

分享给朋友:

“getattributevalue 不损质量?Rails下的图像处理” 的相关文章

科技企业如何实现碳中和

科技企业如何实现碳中和

在当今全球环境危机日益严峻的背景下,碳中和成为了各国共同努力的目标。而科技产业作为推动社会进步的重要力量,在实现碳中和的过程中扮演着至关重要的角色。当科技产业与碳中和相遇,一系列前沿技术应运而生,为我们带来了前所未有的新机遇。一、可再生能源技术太阳能、风能、水能等可再生能源是实现碳中和的关键。光伏技...

物流技术前沿

物流技术前沿

在当今时代,前沿科技如同一股强大的浪潮,汹涌澎湃地席卷着各个行业,物流产业也不例外。前沿科技的迅猛发展,正在引领着物流产业踏上一条智能化变革的崭新之路,为行业的发展带来了前所未有的机遇与挑战。从物联网(IoT)的广泛应用开始,物流产业的智能化变革便拉开了帷幕。通过在物流环节的各个节点,如仓库、运输车...

脑机接口技术突破

脑机接口技术突破

在当今飞速发展的科技领域中,脑机接口前沿技术正逐渐成为备受瞩目的新热点。这一技术将人类的思维与外部设备紧密相连,为我们带来了前所未有的可能性和广阔的应用前景。脑机接口,简单来说,就是通过直接读取和解析大脑的电信号或其他生物信号,来实现人与外部设备之间的交互。它就像是一座连接人类大脑与数字世界的桥梁,...

太空旅游娱乐的文化传播价值探讨

太空旅游娱乐的文化传播价值探讨

在当今时代,太空旅游逐渐从科幻概念走向现实,成为了人们瞩目的新兴领域。太空旅游不仅带给人们前所未有的体验,更在文化传播方面展现出了巨大的价值。太空旅游作为一种极具创新性的旅游形式,其本身就蕴含着丰富的科技文化内涵。从人类对宇宙的探索历程到现代航天技术的发展,每一个环节都承载着人类智慧的结晶和对未知世...

全息投影演出:拆除舞台与观众间的 “隔离墙”

全息投影演出:拆除舞台与观众间的 “隔离墙”

在当今的演艺世界中,一种全新的技术正在悄然改变着观众与舞台之间的关系,那就是全息投影技术。全息投影演出如同一场魔法般的视觉盛宴,它不仅为观众带来了前所未有的震撼体验,更重要的是,它拆除了舞台与观众间的“隔离墙”,让观众仿佛身临其境,与演出融为一体。传统的舞台演出,往往存在着舞台与观众之间的明显界限。...

脑机接口娱乐技术瓶颈与突破方向展望

脑机接口娱乐技术瓶颈与突破方向展望

在当今科技飞速发展的时代,脑机接口技术作为一项极具潜力的领域,正逐渐引起人们的广泛关注。尤其是在娱乐领域,脑机接口技术的应用前景令人期待,但同时也面临着诸多技术瓶颈。本文将对脑机接口娱乐技术的瓶颈与突破方向进行展望。一、当前脑机接口娱乐技术的瓶颈1. 信号采集与解读精度目前的脑机接口设备在信号采集方...