Goruntuyu yeniden boyutlandirma

OpenCV ekolunden geldigim icin Java’nin goruntu isleme icin kullandigi akis ilk asamada oldukca karmasik geldi. OpenCV ile goruntu islemeye devam etmememin nedeni 6 ay kadar Java kullandiktan sonra muptelasi oldugum C++’ tan tiksinmem. Yok memory allocation, yok referansla const mu gonderecez parametreyi gibi kistaslar kafa yorgunlugundan baska bisey yapmiyordu. E tabi yeni bir dille beraber onun kendine has sorunlari basgosterdi. Neyse efenim konumuza geri donelim. Bir image’i resize etmeye calisirken neler ogrendik?

  1. Image.getScaledInstance() kullanmak pek hayirli degil.
    Sonuclar guzel olsa da performans o kadar dusuk ki, scalable hic degil.
  2. Graphics.drawImage() downsampling yaparken pek guzel sonuclar vermiyor.
    Ne kadar anti-aliasing yaparsaniz, rendering quality arttirsaniz da yine de kirpik kirpik gorunuyor kenarlar.
  3. AffineTransform.scale() ile resize etmek yerine tek satirda Graphics.drawImage() ayni isi yapabiliyorsunuz.
  4. JAI kullanmak da kaliteyi arttirmada pek fayda saglamiyor.

Peki durum boyleyken en duzgun resize etme nasil olacak? Hos kalitesiz downsampling benim isimi cok etkilemiyordu cunku bilgisayarli goru ile ugrasiyorum, insanlara sunacak bi resim uretmiyorum, ama yine de gun gelir ihtiyacim olur diye paylasayim.

Graphics.drawImage() eger giris goruntusunu yariya kadar kucultecekseniz ise yariyor, yaridan fazla kucultecekseniz (ornegin 1/3 oraninda) kalitesiz sonuc veriyor.
O halde istedigimiz kucultme oranina yaklasana kadar yarim yarim kucultecegiz, yaklastigimizda ise istedigimiz oranda kucultecegiz.
Ornegin 500×500 boyutlarinda bir goruntuyu 100×100 boyutlarina kuculteceksek ilk once 250×250 boyutlarina, ardindan 125×125 boyutlarina, son olarak da 100×100′e kucultuyoruz.

Goruntuyu buyultmek istiyorsak zaten sorun yok, bir seferde isimizi gorebiliyoruz.

Diyosaniz ki benim server’da kaynak bol, optimizasyon umrumda degil Image.getScaledInstance() kullanin efendim. Ya da tek seferde kucultup uzerine bi de hafiften blur atin.

Enfes kaynak: The Perils of Image.getScaledInstance() – Chris Campbell