好湿?好紧?好多水好爽自慰,久久久噜久噜久久综合,成人做爰A片免费看黄冈,机机对机机30分钟无遮挡

主頁 > 知識庫 > Ruby on Rails下的圖像處理入門教程

Ruby on Rails下的圖像處理入門教程

熱門標簽:淮安自動外呼系統供應商 巫師3地圖標注魔力之所 漯河電銷 AI電銷機器人 線路 中牟外呼系統違法嗎 征服者企業地圖標注 外呼線路從哪里出來的 柯城手機地圖如何做地圖標注 天津外呼系統怎么收費

圖像可以說是任何應用至關重要的一部分。從社交網絡到一個簡單的Bug追蹤器,圖像都扮演著重要的角色。然而管理圖像并不是一件容易的事情,需要提前耗費大量的時間精力去計劃。

本文演示了如何在Rail中實現這一目標。如何處理你的圖像以及在后臺創建多個版本?如何通過壓縮圖像又不損圖像質量,以此來提高頁面性能?這些且聽本文一一道來。
入門

本文教程是運行于Rails 4.2,通過MongoDb數據庫和HAML呈現視圖。不過本文所展示的片段應該兼容任何Rails版本(盡管有些配置差異)。

布置舞臺

ImageMagick是一套功能強大、穩定而且開源的工具集和開發包,你可以通過包管理把它安裝在你的電腦上。

Ubuntu上:

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

現在我們需要一個連接到本地ImageMagick庫的Ruby適配器。你可以使用MiniMagick,因為它是輕量級的:

# Gemfile
 
gem 'mini_magick'

MiniMagick的特性

在正式開始之前,讓我們先了解一下某些MiniMagick的特性,以避免不必要的錯誤。

打開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

操縱圖像存儲到一個臨時的路徑有消失的危險。所以要把它放到磁盤中,一個簡單的調用編寫方法如下:

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

轉換圖像

或許你最常見的工作之一就是將圖像轉換成不同的格式。MiniMagick可以簡化這一過程:

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)

至此,讓我們來看看如何將以上的這些與我們的Rails應用聯系到一起。
上傳文件

Carrierwave簡化了在Ruby中上傳文件,同時它與MiniMagick交互的也很好。

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

注意:如果你是在ActiveRecord或DataMapper上,配置會稍微不同。Carrierwave官方文檔介紹了正確的方法,點此進入。

獲取:

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

這段代碼是自說明,storage :file指示服務器將圖像存儲在本地服務器上,store_dir指定位置。

自從文件通過互聯網傳送,總會過濾傳入的文件:

# 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

編輯image_uploader.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

上傳圖像在store_dir下是可用的。然而上傳的圖像是立即被處理的,并被200×200的圖像覆蓋。我們沒有原始文件的副本留作以后編輯。所以為避免這種情況,我們需要創建多個版本的文件。

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

下面顯示的是上段代碼創建兩個版本,檢查版本由Carrierwave創建:

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

這代碼也是運行于前臺,是一個阻塞操作,但至少可以盡可能的推遲到最后一刻。我們可以通過Resque在后臺進一步的運行:

# 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)

性能提升

圖像是厚重的,往往會減慢網站。減少頁面負擔的一種方法是壓縮這些圖像。Carrierwave圖像優化器可以幫助我們飛速的壓縮圖像。

將下面這段添加到Gemfile:

gem 'carrierwave-imageoptimizer'

然后編輯image_uploader:

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

如此壓縮不會有視覺喪失。

圖像處理是一個巨大的垂直,我們幾乎只觸及表面。我們可以建立很多很酷的東西。如果您對這篇文章感興趣,請在評論中分享您的想法。

您可能感興趣的文章:
  • 快速安裝Ruby on Rails的簡明指南
  • win7安裝ruby on rails開發環境
  • 在 Ubuntu 12.04 Server 上安裝部署 Ruby on Rails 應用
  • Windows下Ruby on Rails開發環境安裝配置圖文教程
  • Ruby On Rails上手筆記(安裝使用全過程)
  • CentOS7下搭建ruby on rails開發環境
  • 幾個加速Ruby on Rails的編程技巧
  • Ruby on rails安裝后去掉DL is deprecated,please use Fiddle警告信息的方法【測試可用】

標簽:克拉瑪依 南昌 內江 甘孜 棗莊 河池 大慶 西雙版納

巨人網絡通訊聲明:本文標題《Ruby on Rails下的圖像處理入門教程》,本文關鍵詞  Ruby,Rails,下,的,圖像處理,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《Ruby on Rails下的圖像處理入門教程》相關的同類信息!
  • 本頁收集關于Ruby on Rails下的圖像處理入門教程的相關信息資訊供網民參考!
  • 推薦文章
    主站蜘蛛池模板: 国产一区二区三区成人久久片| 国产69精品麻豆久久久久| 404黄台免费下载| 国产精品无码久黑人无码牛牛久久| 色综久久综合桃花网| 丰满大码熟女在线播放| 2023国产视频| 一女多男部队np军人小说| 91网红福利精品区一区二| 色欧美片视频在线观看| 晚上睡不着偷偷看B站| 曰批40分钟视频免费看| 人妻换人妻互换A片爽文| 欧美日韩在线精品视频一区二区三区| 水蜜桃爱如潮水带你飞| y0UjiZZZXXX日本人| 快手各网红裸体福利视频| 把美女班主任啪到哭的视频| 公交车乱欲| 留守妇女小说在线阅读| 男女靠逼网站| 日韩色欲aV一区二区精品视频| 跟鬼做的肉肉H文| 羞羞动漫视频在线观看| 求你们不要了np高辣| 第一国内永久免费福利视频| 国产乱XX乂XXX交| sss亚洲国产欧美一区二区 | 国产亚洲日韩a在线欧美尤物| 日本一级A片玉足视频| 国产精品无码亚洲欧美黑寡妇| yy6080午夜久久久久精品| 精品亚洲国产成人app| 韩国理伦色情理论片在线观看| 一本色道久久综合狠狠躁篇| 狠狠色依依成人婷婷九月| 黄色网址免费| 免费观看高清视频| 欧美gay巨大粗又长| 娇妻在客厅被朋友玩得呻吟h文| 男人扒下美女胸罩喝奶水|