Ruby ile Resim Ä°ÅŸlemleri

Ruby ile resim iÅŸlemleri (Image processing with Ruby) konusunda bir yazı yazma gereÄŸi hissetmemin nedeni, bazı arkadaÅŸlarımın bana resim iÅŸlemlerinin nasıl olacağını sorması ve bununla beraber yüksek kaliteli ve bir klasör altındaki birçok resmin boyutlarını deÄŸiÅŸtiren bir programa (Multiple Image Resizer) ihtiyaç duymam oldu. Bu programa ihtiyaç duymamın rengi, arkadaşımın yeni aldığı dijital fotoÄŸraf makinasının 3200×2400 çözünürlükte resimler üretmesi oldu. Her çekilen resmi aç, çözünürlüğünü (1/2 veya 1/4 oranında) deÄŸiÅŸtir, kaydet.. falan filan.. oooooo.. yazılımcı adam tembel olur, tembel adamda yaratıcı olur sloganıyla Ruby’de resim iÅŸlemlerine hakkında bir yazı yazmaya karar verdim.. Ä°yi etmiÅŸmiyim göreceÄŸiz :)

Öncelikle RMagicK kütüphanesinden bahsedelim biraz; Bu kütüphane ImageMagick® ve GraphicsMagick adlı kütüphaneler ile Ruby arasında bir köprü görevi gören bir yapıdır. Bu her iki resim kütüphaneside oldukça profesyonel kütüphanelerdir ve birçok dile ve iÅŸletim sistemine aktarılmış halleri mevcuttur. Windows tabanlı sistemler için gem paketi bu linkte bulunur, bu paket içerisinde ImageMagicK’in derlenmiÅŸ halde gelir.

Windows bir sistem için kurulumu özetleyecek olur isek;

  • Bu adresten sıkıştırılmış dosya indirilir.
  • Var ise daha önceden yüklenmiÅŸ olan RMagicK kütüphanesi kaldırılır. “gem uninstall RMagick” komutu çalışırılır ve Ruby üzerinden kaldırılır. Register’dan MAGICK_CONFIGURE_PATH anahtar kelimesi silinir. “regedit” komutu Register’a girilir ve Edit > Find ile bu anahtar kelime bulunur ve silinir. Bu silme iÅŸleminden önce File > Export ile Register’ın yedeÄŸini almak isteyebilirsiniz. Önemli Not: EÄŸer elinizde RMagicK 1.4.0 ve daha düşük bir RMagicK sürümü var ise; sizin “site_ruby/i386/RMagick.so”, “site_ruby/RMagick.rb” ve “ImageMagick” register anahtar kelimesini elle silmeniz gerekebilir. Daha detaylı bilgi için Readme’yi okuyun.
  • Sıkıştırılmış dosyayı herhangi bir “temp” klasöre açın, Örnek: “C:\RMagicK” gibi. Bu klasör bundan sonra hedef klasör olarak adlandırılacaktır.
  • Sıkıştırılmış dosyayı açtığınız klasöre gidip “gem install rmagick –local” komutunu uygulayın. Bu komutta bir hata alırsanız lütfen “gem” uygulamanızı güncelleyin ve daha sonra tekrar deneyin. Gem uygulamanızı güncellemek için “gem update –system” komutunu kullanın, eÄŸer makinanız internete baÄŸlı ise iÅŸlemi otomatik yapacaktır.
  • Bu iÅŸlemden sonra hedef klasör içerisindeki ImageMagick-XXXXXX-windows-dll.exe adlı dosya çalıştırılır ve kurulur. EÄŸer Ruby on Rails ve/veya buna benzer bir uygulamanız bu kütüphaneyi kullanacaksa ve bir sorunla karşılaşırsanız restart edin.. :)

Kurulumumuzu da yaptıktan sonra, çok kolay ve basit olan uygulamamızı yazalım.. :)
Öncelikle yardımcı sınıflarımızıdan hazırlayalım. Bu sınıflar LogHelper ve Helper olsun..
Bu sınıfları buraya yazmamın nedeni; bazı özellikler görür ve kullanırsınız amacı ile yapmaktayım.
ÖrneÄŸin; “private_class_method :new” methodunun ne iÅŸ yaptığını anlatmıyorum ama siz deneyerek bulabilirsiniz veya varlığından haberdar olursunuz.. :)
[ruby]
module UordekWS

class Helper
private_class_method :new

def Helper.replace(str, pattern, replacement)
#Helper.LogInfo pattern, replacement
str.gsub(Regexp.new(Regexp.escape(pattern)), replacement)
end
end

class LogHelper
require “log4r”

@@log = nil

DEFAULT_LOG_NAME = “LogHelper”

private_class_method :new

def LogHelper.create(name, outputter = Log4r::Outputter.stdout)
if @@log == nil
@@log = Log4r::Logger.new(name)
@@log.outputters = outputter
else
if @@log[name] == nil
@@log = Log4r::Logger.new(name)
@@log.outputters = outputter
end
end
end

def LogHelper.puts(*rest)
LogHelper.create(DEFAULT_LOG_NAME) unless @@log
str = “”
rest.each { |var| str << var.to_s } @@log.info str end def LogHelper.error(*rest) LogHelper.create(DEFAULT_LOG_NAME) unless @@log str = "" rest.each { |var| str << var.to_s } @@log.error str end end end [/ruby] Daha sonra esas programımızı yazalım.. [ruby] $stdout.sync = true # Bu iÅŸlem yazma ve okuma iÅŸlemlerinin hemen yapılmasını saÄŸlar. "gets" iÅŸlemi varken kullanılmalıdır. require 'RMagick' require "Helper.rb" include Magick include UordekWS # Folder bilgisi argüman olarak gelmedi ise, kullanıcıdan alınır. folder = "" fileType = "jpg" if (ARGV.length == 0) print "Type a folder(C:\\SampleImages) :" folder = gets.chomp else folder = ARGV[0] end # Herhangi bri folder ad girilmemiÅŸ ise, programdan çıkılır. exit if folder.length == 0 LogHelper.puts "Islem basliyor..!" source_files = File.join("**", "*.#{fileType}") Dir.chdir(folder) file_count = 0 Dir.glob(source_files) do |fileName| file_count += 1 begin img = Image.read(fileName)[0] # Dosya Image sınıfı tarafından okunur. img.resize!(0.5) # %50 oranında resize iÅŸlemi yapılır. img.write(fileName + "new.jpg") # garip bir isimle kayıt edilir :) rescue ImageMagickError => err # RMagicK’ya özel bir hata üretildiÄŸinde
LogHelper.error “#{fileName} resize operation failed..”, err.backtrace.join(“\n”)
rescue Exception => err # Sistem genelinde bir hata üretildiğinde
LogHelper.error “There is a software problem..”, err.backtrace.join(“\n”)
else # Herhangi bir hata yok ise
LogHelper.puts “#{fileName} resize operation completed..”
end
end

LogHelper.puts “Herhangi bir dosya bulunamadi..#{source_files}” if file_count == 0
[/ruby]
Bu kod ImageMagicK kullanılır ise en performansız koddur ama bizim için performans önemli deÄŸil, kalite daha önemli, sonuçta 90 adet resimi 90 sn gibi bir süre içerisinde iÅŸleyebiliyor. Daha fazla performans için “thumb!” methoduna bakmanızı tavsiye ederim.

Kodlar hakkında sorularınız olursa yorumlarla bana ulaşabilirsiniz.
Kolay gelsin :)

Bir Cevap Yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir