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

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

admin2周前 (06-11)未来畅想29

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://www.kejiyl.com/post/4689.html

分享给朋友:

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

新材料领域的重大突破

新材料领域的重大突破

在当今科技飞速发展的时代,新材料技术犹如一颗璀璨的明星,在科技产业的前沿熠熠生辉。它的创新与突破不仅为各个领域带来了全新的机遇,也推动着科技产业不断向前迈进。新材料技术的创新,首先体现在其种类的不断丰富。从传统的金属、陶瓷等材料,到如今的纳米材料、超导材料、智能材料等,每一种新材料都具有独特的性能和...

太空旅游娱乐商业模式的深度剖析

太空旅游娱乐商业模式的深度剖析

在当今科技飞速发展的时代,太空旅游作为一个极具吸引力的新兴领域,正逐渐从科幻走向现实。太空旅游娱乐商业模式,以其独特的魅力和巨大的商业潜力,吸引了众多投资者和企业家的目光。本文将对太空旅游娱乐商业模式进行深度剖析,探讨其发展现状、关键要素以及未来的发展趋势。一、发展现状目前,太空旅游娱乐产业仍处于起...

脑机接口娱乐在社交娱乐方面的创新应用

脑机接口娱乐在社交娱乐方面的创新应用

在当今科技飞速发展的时代,脑机接口作为一项极具潜力的前沿技术,正在悄然改变着我们的生活和娱乐方式。尤其是在社交娱乐领域,脑机接口带来了前所未有的创新应用,为人们带来了全新的体验。脑机接口娱乐在社交娱乐方面的第一个创新应用是实现了更加自然、直观的互动方式。传统的社交娱乐方式,如游戏、聊天等,往往依赖于...

脑机接口娱乐用户隐私保护的关键举措

脑机接口娱乐用户隐私保护的关键举措

在当今科技飞速发展的时代,脑机接口技术正逐渐走进我们的生活,为人们带来了前所未有的娱乐体验。随着这一技术的广泛应用,用户隐私保护问题也日益凸显,成为了亟待解决的关键议题。脑机接口技术能够直接读取和解析大脑信号,从而实现与外部设备的交互,为娱乐领域带来了无限可能,如沉浸式游戏、虚拟互动等。但与此这种直...

全息投影演出场景转换的神奇技巧

全息投影演出场景转换的神奇技巧

在当今的演艺领域,全息投影技术以其超凡的视觉效果和令人惊叹的场景转换能力,成为了吸引观众目光的重要利器。这种神奇的技术能够将虚拟影像与现实舞美融合,创造出一个个令人仿佛身临其境的梦幻场景,而其中场景转换的技巧更是让人叹为观止。全息投影演出的场景转换,首先得益于其独特的投影方式。传统的舞台场景转换往往...

脑机接口娱乐技术发展路线图解读

脑机接口娱乐技术发展路线图解读

在当今科技飞速发展的时代,脑机接口娱乐技术正逐渐成为人们关注的焦点。它代表着一种全新的交互方式,将人类的思维与电子设备紧密结合,为娱乐领域带来了前所未有的变革。下面,我们将对脑机接口娱乐技术的发展路线图进行深入解读。脑机接口娱乐技术的发展可以追溯到早期的神经科学研究。科学家们开始探索如何读取和理解人...