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

Share