Bulanık fotoğrafı düzeltme

Merhaba, programa bir PictureBox ekledim ancak fotoğrafı eklediğimde beklediğimden küçük çıktı ve bu yüzden fotoğrafı büyütebilmek için SizeMode’u StretchImage olarak ayarladım ancak fotoğrafı büyüttüğüm zaman bulanık gözüküyor. Bunu düzeltmenin bir yolu var mı ?

Bunun kodla alakası yok, resmin kalitesinin yükseltilmesi lazım.

Bazı yollar var ama nasıl kullanıldıklarını anlamadığım için belki farklı bir çözüm çıkar diye buraya sordum. Yani kodla yapılabiliyor olması lazım.

kodla alakası var, çizdiğin yeri başlangıçta büyük yapabilirsin veya zoom yaptığında daha büyük picturebox ın içine tekrar çizeiblirsin fikir olarak bunu verebilirim.

Soruyu biraz daha açık şekilde sorarsan daha doyurucu cevaplar alabilirsin.

Resim ekledin, küçük çıktı, demişsin.

Eklediğin resim hangi formatta? Yani dosya uzantısı ne? Çözünürlüğü ne?

Bunları neden söylemelisin. Resim dosyaları da bilgisayar için sadece birer veri dosyası. Ve verinin nasıl kaydedildiği önemli.

Eğer BMP dosyası şeklinde, yada sıkıştırılmış jpeg dosyası olarak kullanıyorsan sadece elinde belirli sayıda pixelin verisi var demektir.

Bu durumda, resmi büyüttükçe pixel sayısı sabit olduğundan elinde daha büyük pixellerden oluşacak bir görüntü oluşturabilirsin. Yani bir resme elinde olmayan bir veriyi koyamayacağın için aslında içindeki pixel sayısını artıramazsın.

Bunun için elindeki resmin türü çoğunlukla raster image diye tabir edilen türdedir. Diyebiliriliz.

Diğer bir türü, ise vektörel çizimlerdir, bunlar pixel verisi yerine, çizgilerin formülleri tutar, bu durumda, formüle değer vererek resmi istediğin kadar büyütebilirsin…

Vektörel grafik - Vikipedi (wikipedia.org)

Yani ilk soru hangi formatta resim kullanmak istiyorsun? Bundan sorulur. Eğer elindeki resim vektörel formatta bir resim ise bu resim büyüttüğünde bozulmaz. Ama raster image ler büyüttükçe pixeller belirginleşir.

Raster image ler ile çalışıyor isen, interpolasyon ile arada olmayan pixel verisini hesaplatıp iki pixel arasında yeni pixeller üretirsin ki bu aslında her zaman doğru olmayabilir.

Verdiğin link bunu anlatıyor.

How to: Use Interpolation Mode to Control Image Quality During Scaling - Windows Forms .NET Framework | Microsoft Docs

Yani aslında olmayan bir pixeli uyduruyorsun ve her zaman doğru uymayacağı için bazan bulanık yada hatalı çıkabilir.

Resim fotoğraf işleme konusunda akıllı algoritmalarla bir yere kadar resimde iyileştirmeler yapılabilir ama orada olmayan bir veriyi konuştuğumuzdan her zaman doğru sonuçlar oluşmayabilir. Tabi imkansız diye bir şey yoktur, akıllı algoritmalarla en iyi tahminler yapılabilir ama bu resimde asla keskinlik bekleyemeyiz.

Asıl önemli soru da şu. Derdimiz sadece bir butona, yada bir image box a resim eklemek mi, yoksa resim üzerinde düzenleme yapılacak bir kodlama mı?

Yani Gimp, yada Photoshop gibi bir program mı tasarlıyorsun, yoksa sadece bir resim eklemen gerekti ve bunun için mi soruyorsun bilmek gerekir.

Çünkü, resim işlemek ayrı cevap gerektirir, yada sadece arka plan için kullanılacak bir resim ayrı cevaplar gerektirir.

Eğer sadece resmi yerleştirip boyutlandıracağım diyorsan.

Çok basit bir yöntem, resmini vektörel imaje çevir, sonra

Using Vector (SVG) Graphics in C# .NET | Codementor

Örnekteki gibi istediğin kadar büyüt.

Yok ben resim ve fotoğraf işlemek istiyorumd dersen, o zaman sana bu mesajın iki katı kadar daha mesaj ve link yazmam gerekecek.

Aslına bakarsan bu bir kodlama konusu ancak, resim işleme programı yazdığında olur. Diğer türlü sadece resimle çalışma konusu.

2 Beğeni

Elimdeki dosya bir PNG dosyası ve görüntü işlemek gibi bir derdim yok. Sadece çok küçük olduğu için programda kullanırken büyüterek kullanmak istiyorum. Kod yazarak elde edebileceğim çözümlerin nasıl uygulandığını bulamadım. Yani ortada Gimp, Photoshop gibi bir program tasarlama durumu yok. Ayrıca

Bu linke daha önceden bakmıştım ve buradaki NearestNeighbor seçeneği işime yarıyor ama bunu PictureBox ta nasıl kullanabileceğimi anlamadım.

Bunun yerine Graphics i kullanabilirsin belki bunun da birsürü özelliği var.

Araştıracağım belki işe yarar bir şeyler çıkar.

PNG ise raster image bu durumda seçenekler kısıtlandı.

c# - How to change resolution (DPI) of an image? - Stack Overflow

Hafiften çözünürlüğü ile oynayabilirsin. Bunun yerine resmin bir özelliği yok ise daha yüksek çözünürlükte bir tane kullanabilirsin.

How to: Use Interpolation Mode to Control Image Quality During Scaling - Windows Forms .NET Framework | Microsoft Docs

Bu işine yarıyorsa kodda anlamadığın kısmı sorabilirsin onun üzerinde çalışabiliriz.

Koda baktığımda karışık bir şey göremedim, tabi ilk kullanan birine yabancı gelebilir.

Nesne olarak image kullanmış, picturebox yada herhagi bir rectangle, nesne içine koyulabilir gibi duruyor.

Sorunu kısıtladığımıza göre çözüme de yakınız demektir.

how to resize an image to fit a canvas c# Code Example (codegrepper.com)

Bile sorunu çözebilir.

Burada kullanamadım dediğin kısmı anlayamadım.

Bunu da netleştirirsek sorun çözülebilir.

Birazcık kod paylaşırsan üzerined konuşmak kolay olabilir.

1 Beğeni

Evet, şu kısım işe yarıyor olmalı:

e.Graphics.InterpolationMode = InterpolationMode.NearestNeighbor;
e.Graphics.DrawImage(
   image,
    new Rectangle(10, 250, (int)(0.6 * width), (int)(0.6 * height)),
    // destination rectangle
    0,
    0,           // upper-left corner of source rectangle
    width,       // width of source rectangle
    height,      // height of source rectangle
    GraphicsUnit.Pixel);

Burada resmi küçültmek için kullanılmış sanırım ama büyütünce de istediğim sonucu vermesi lazım. Ancak kodu nereye eklemem gerektiğini anlamadım sanırım bu yüzden olmuyor. Ayrıca geç cevap verdiğim için üzgünüm okulda olduğum için cevap veremedim.

Geç cevap vermen sorun değil, olabilir aynısı benim için de geçerli, herkesin kendine göre işi gücü olabilir, orasına takılma.

Bu arada benim de aklıma bir şey geldi, yukarıdaki koda ayrıca mesaj yazayım, hatta örnek bir kodu komple yapalım fırsat bulunca, ekran görüntüleriyle vs.

Ama sonuç şu, eğer elindeki resmin boyu belirli bir büyüklüğün üzerinde büyütülürse zaten blur / bulanıklaşma olacaktır.

Hatta bunun sebebinin ta kendisi zaten interpolasyon.

Başa dönecek olursak, kodunu paylaşırsan, hangi kısmına nasıl ekleyeceğine bakarız, resmi de paylaşabilirsen sonuçları da deneyerek görebiliriz.

1 Beğeni

O zaman sanırım photoshop gibi bir program ile büyütüp bulanıklığı düzeltmeyi deneyebilirim.
Ayrıca fotoğraf şu:
icons8-hdd-80
Kaydet butonu olarak kullanacağım ancak bir acelesi yok o yüzden henüz kod yazmadım. Sadece program.cs ve Form1.cs dosyaları var (yani cs dosyası olarak, sonuçta kodlar cs dosyasına yazılıyor)
Bu fotoğrafı PictureBox olarak ekleyip SizeMode u StretchImage olarak yap sonra PictureBox u büyütmeyi dene. Benimkiyle aynı sonuç çıkacak (yani fotoğraf bulanıklaşacak).

Yani basit bir simge kullanıyoruz. Bu durumda şunu yapabilirsin. Basit bir simge rahatlıkla vektörel resme dönüşür. Vektörel resme çevir istediğin kadar büyüt bir sıkıntı yaşamazsın.

Diğer şekilde interpolasyon her zaman resmin keskinliğini azaltır. Bunun yerine yüksek çözünürlükte bir resim oluşturup kullanabilirsin tabi ki.

Ama bir fotoğraf olmadığı basit bir simge olduğu için en güzeli, vektörel bir imaja dönüştürmen.

2 Beğeni

sn @semtex in belirttiği gibi, vector-based image kullanınca bulanıklaşma olmaz. Nasıl kullanılacağı ile ilgili birden fazla kaynak bulabilirsin. Ben bir tane örnek olsun diye paylaşıyorum.

1 Beğeni

Detaylıca anlatılmış teşekkürler. O zaman fotoğrafı SVG ye çevirip kullanacağım.

1 Beğeni