国产激情自拍_国产9色视频_丁香花在线电影小说观看 _久久久久国产精品嫩草影院

首頁 > 編程 > Ruby > 正文

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

2020-10-29 19:41:17
字體:
供稿:網(wǎng)友

圖像可以說是任何應(yīng)用至關(guān)重要的一部分。從社交網(wǎng)絡(luò)到一個(gè)簡單的Bug追蹤器,圖像都扮演著重要的角色。然而管理圖像并不是一件容易的事情,需要提前耗費(fèi)大量的時(shí)間精力去計(jì)劃。

本文演示了如何在Rail中實(shí)現(xiàn)這一目標(biāo)。如何處理你的圖像以及在后臺(tái)創(chuàng)建多個(gè)版本?如何通過壓縮圖像又不損圖像質(zhì)量,以此來提高頁面性能?這些且聽本文一一道來。
入門

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

布置舞臺(tái)

ImageMagick是一套功能強(qiáng)大、穩(wěn)定而且開源的工具集和開發(fā)包,你可以通過包管理把它安裝在你的電腦上。

Ubuntu上:

sudo apt-get -y install imagemagicksudo apt-get -y install libmagic-devsudo apt-get -y install libmagickwand-dev

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

brew install imagemagick

現(xiàn)在我們需要一個(gè)連接到本地ImageMagick庫的Ruby適配器。你可以使用MiniMagick,因?yàn)樗禽p量級(jí)的:

# Gemfile gem 'mini_magick'

MiniMagick的特性

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

打開Rails控制臺(tái)(Rails c)并運(yùn)行以下代碼:

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

讓我們調(diào)整一下以適應(yīng)我們的iPad:

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

更改后的文件存儲(chǔ)在哪呢?

image.path # temp path

操縱圖像存儲(chǔ)到一個(gè)臨時(shí)的路徑有消失的危險(xiǎn)。所以要把它放到磁盤中,一個(gè)簡單的調(diào)用編寫方法如下:

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

轉(zhuǎn)換圖像

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

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

你還可以將多個(gè)操作放在同一模塊中:

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

至此,讓我們來看看如何將以上的這些與我們的Rails應(yīng)用聯(lián)系到一起。
上傳文件

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

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

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

獲取:

bundle install

創(chuàng)建第一個(gè)上傳:

#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" endend

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

自從文件通過互聯(lián)網(wǎng)傳送,總會(huì)過濾傳入的文件:

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

編輯image_uploader.rb來處理上傳的圖像:

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

嘗試從Rails控制臺(tái)創(chuàng)建一個(gè)新的圖像:

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

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

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

下面顯示的是上段代碼創(chuàng)建兩個(gè)版本,檢查版本由Carrierwave創(chuàng)建:

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

你注意到這些圖像是瞬間生成的嗎?這意味著圖像轉(zhuǎn)換發(fā)生在同一線程中,并且執(zhí)行是被阻塞的,直到完成為止。在生產(chǎn)應(yīng)用中,在同一線程里創(chuàng)建一個(gè)圖像的多個(gè)版本是不受歡迎的。相反,我們應(yīng)該有條件的處理這種情況。

# 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_liveend def is_live=(value) @is_live = valueend#....

這樣,當(dāng)我們創(chuàng)建一個(gè)新的圖像時(shí),副本將不會(huì)生成。我們可以在需要的時(shí)候手動(dòng)去觸發(fā),運(yùn)行如下代碼:

img.media.is_live = trueimg.saveimg.media.recreate_versions! :cover

這代碼也是運(yùn)行于前臺(tái),是一個(gè)阻塞操作,但至少可以盡可能的推遲到最后一刻。我們可以通過Resque在后臺(tái)進(jìn)一步的運(yùn)行:

# lib/resque/image_queue.rbclass 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 endend

然后,列隊(duì):

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

性能提升

圖像是厚重的,往往會(huì)減慢網(wǎng)站。減少頁面負(fù)擔(dān)的一種方法是壓縮這些圖像。Carrierwave圖像優(yōu)化器可以幫助我們飛速的壓縮圖像。

將下面這段添加到Gemfile:

gem 'carrierwave-imageoptimizer'

然后編輯image_uploader:

# app/uploaders/image_uploader.rd #..... include CarrierWave::ImageOptimizerprocess :optimizeprocess :quality => 100#....

如此壓縮不會(huì)有視覺喪失。

圖像處理是一個(gè)巨大的垂直,我們幾乎只觸及表面。我們可以建立很多很酷的東西。如果您對(duì)這篇文章感興趣,請?jiān)谠u(píng)論中分享您的想法。

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
国产激情自拍_国产9色视频_丁香花在线电影小说观看 _久久久久国产精品嫩草影院
中文字幕在线影院| 国产系列在线观看| 免费精品国产自产拍观看| 国产区视频在线观看| 国产在线超碰| 国产高清免费av在线| 国产日韩欧美一区二区三区视频| 老司机精品视频一区二区| 欧美精品一区二区三区免费| 国内自拍视频在线观看| 中文字幕视频在线| aaa大片在线观看| 激情四房婷婷| 2021av天天| 不卡av免费观看| 国产美女在线播放| 精品av中文字幕在线毛片| 日本成人在线播放| 国产免费人人看| 小说区乱图片区| 国产午夜在线观看| 在线免费日韩| 国产有码在线| 在线中文字幕视频| 国产在线视频精品视频免费看| 国产私拍精品| 性网站在线播放| ·天天天天操| 国产亚洲精品拍拍拍拍拍| 亚洲欧美精品日韩欧美| 最近免费中文字幕在线第一页 | 国产精选一区二区三区不卡催乳| 国产经典自拍视频在线观看| 老司机精品视频一区二区| 最新中文字幕在线| 青草在线视频在线观看| 2018中文字幕在线| 国产视频1区| √天堂资源地址在线官网| 日韩亚洲一区中文字幕| 在线观看免费观看在线91| 国产精品美女视频免费观看软件| 九九精品视频在线观看九九| www.超级碰| 超碰免费在线观看| 麻豆福利在线观看| 丁香婷婷激情| 国产日产一区二区三区| 最近最好的中文字幕2019免费 | 日本不卡影院| 四虎精品视频| 亚洲精品在线播放视频| 在线视频99| 免费观看久久久久| 九九热免费在线视频| 国产女王在线**视频 | 国产91大片| 国产免费av网站| 国产免费麻豆视频| 国产不卡精品一区二区三区| 国产不卡在线| 超碰91在线| 国产天堂在线| 在线国产91| 超碰在线97国产| 91超碰国产在线| 国产一级免费看| av人人综合网| 最近高清中文在线字幕在线观看| 国产成人精品综合网站| 亚洲尤物在线视频| 黄色av免费看| 777电影在线观看| 黄色av网站在线免费观看| 国产精品yjizz视频网一二区| 中文字幕av网| 国产欧美在线观看视频| 日本调教视频在线观看 | 国产免费专区| 青青九九免费视频在线| 中文字幕不卡| 蜜桃视频中文字幕| 国产成人综合亚洲欧美在| а天堂8中文最新版在线官网| 国产区在线看| 国产嫩草在线视频| 欧美色欧美亚洲另类二区精品 | 国产三级在线免费| 久草.com| 四虎精品成人a在线观看| 国产精品爱久久久久久久小说| 久久综合精品视频| 青青草观看免费视频在线| 国产美女在线观看| 免费电影网站在线视频观看福利| 中文字幕2019第三页| 精精国产xxxx视频在线动漫| 国产经典自拍视频在线观看| 国产午夜在线| 国产黄色免费网站| 91涩漫在线观看c| 国产高清免费av在线| 国产黄色一级片| 精品欧美色视频网站在线观看| 中文字幕视频免费在线观看| 国产午夜三区视频在线| 国产欧美一区二区三区小说| 国产视频福利在线| 粉嫩av一区| 丁香视频免费观看| 国产偷倩在线播放| 999国产在线视频| 99精品老司机免费视频| 在线免费观看你懂的| 国产羞羞视频| 在线中文字幕视频| 午夜在线观看91| 女人色在线免费视频| 成人精品福利| 精品国产二区三区| 久热国产在线| 国产在线视频网站| 国产啊啊啊视频在线观看| 在线观看视频污| 樱花草在线观看www| 日本一本久久| 最新av免费看| a视频在线观看| 国产人成在线观看| 日本福利在线| 在线中文av| 国产理论在线观看| 国产高清免费av在线| 男人天堂网在线观看| 国产精品视频一区二区三区麻豆 | 中文字幕人成高视频| 91中文字幕| 最近高清中文在线字幕在线观看| 国产超碰97| 最新中文字幕在线视频| wwwww在线观看免费视频| 国产麻豆精品入口在线观看 | 在线视频三级| 国产一二三视频| 亚洲第一区视频| 国产高清视频在线| 国产亚洲精品久久久网站好莱| 国产精品久久久久久福利| www在线观看播放免费视频日本| 天堂资源最新版在线视频观看免费网| 精品美女在线观看视频在线观看| www免费在线观看| 热99在线观看| 免费在线超碰| 老司机在线视频二区| 樱花草在线观看www| 国产99在线|亚洲| 国产成人精品综合网站| 国产第一页在线| 国产精品白浆流出视频| 国产性网软件大全| 国产精品蜜臀| 国产一级片网站| 国产精品美女视频免费观看软件 | 99热播在线观看| 国产夫妻视频| 国产精品扒开做爽爽爽的视频| 五月天婷婷基地| 九九色在线观看| 天天操天天艹| 国产成免费视频| 国产成人亚洲精品播放器下载| 国产区在线看| 精精国产xxxx视频在线中文版| 在线视频1区2区| 欧美日韩在线中文字幕| 九九热在线视频| 国产香蕉视频在线观看| 国产亚洲依依| 精品剧情v国产在线观看| 天天干天天摸| 黄网在线免费| 国产视频二区在线观看| 在线观看av的网站| 国产在线观看18| 中文av字幕| 狠狠干在线视频| 最近中文字幕mv免费高清电影 | 国产福利小视频在线| 精品女厕厕露p撒尿| 秋霞av在线| 国产二区视频在线观看| а√最新版在线天堂| 日本中文字幕在线观看| 中文在线视频观看| 中文字幕视频在线| www.操.com| 国产成人无吗| 国产精品白浆视频免费观看| 国产在线激情视频|