2012-05-18 21 views
9

Bir görüntüyü kopyalıyorum. (Gerçek kodum görüntüyü yeniden boyutlandırıyor ama bu benim soruyla alakalı değil.) Kodum böyle bir şeye benziyor.Saydamlık/Alfa Kanallı Görüntü Çizmek için Graphics.DrawImage() öğesini kullanma

Image src = ... 

using (Image dest = new Bitmap(width, height)) 
{ 
    Graphics graph = Graphics.FromImage(dest); 
    graph.InterpolationMode = InterpolationMode.HighQualityBicubic; 
    graph.DrawImage(src, 0, 0, width, height); 
    dest.Save(filename, saveFormat); 
} 

Bu src (GIF gibi) asetat ya da (PNG gibi) bir alfa kanalı ile bir görüntü yüklenen sürece büyük bir iş gibi görünüyor.

Asetatları/alfa kanalı yeni görüntüye aktarmak için DrawImage()'u nasıl alabilirim ve sonra dosyayı kaydettiğimde onları saklayabilir miyim?

+0

Soru "saveFormat" değişkeninin değeri nedir? "PixelFormat.Format32bppArgb" (veya alfa kanalı ele alınmış başka bir biçim) olmalıdır. Ayrıca şunu deneyin: 'kullanarak (Image dest = yeni Bitmap (genişlik, yükseklik, PixelFormat.Format32bppArgb))'. –

+0

Bu, alfa kanalları için çalışıyor gibi görünüyor, ancak GIF asetatları için değil. 'saveFormat', giriş dosyasının formatına bağlı olarak değişecektir. Giriş dosyası alfa kanalı desteklemiyorsa, görüntünün alfa kanalı pikselleri içermeyeceğini varsaymak güvenlidir. –

+0

Peki, GIF dosyaları için 'saveFormat'ın değeri nedir o zaman :)? –

cevap

22

Çok açık değil, söylemediğiniz çok şey var. Şeffaflıkla ilgili en büyük sorun, onu görememenizdir. Birkaç adım atladınız, açıkça yeni bitmap'inin piksel biçimini belirtmediniz, hiçbir şekilde başlatmadınız ve hangi çıktı biçimini kullandığınızı söylemediniz. Bazıları şeffaflığı desteklemiyor. Öyleyse onu berraklaştıran bir versiyon yapalım. Paint.NET içinde şöyle bir PNG resmi Gönderen:

enter image description here

Sen açıkça görebilirsiniz:

enter image description here

bu resim bu kodu

 using (var src = new Bitmap("c:/temp/trans.png")) 
     using (var bmp = new Bitmap(100, 100, PixelFormat.Format32bppPArgb)) 
     using (var gr = Graphics.FromImage(bmp)) { 
      gr.Clear(Color.Blue); 
      gr.DrawImage(src, new Rectangle(0, 0, bmp.Width, bmp.Height)); 
      bmp.Save("c:/temp/result.png", ImageFormat.Png); 
     } 

Üretir kullanma mavi arka plan şeffaflık çalıştı.

+1

Peki, amacım giriş formatıyla hangi formatın eşleştiğini desteklemekti. Oldukça spesifik olduğumu düşünmüştüm. Sadece kodun sadece bir dosya türünü desteklemesi amaçlanmamıştı. Belki her dosya türünü işlemek için bir kod koduna ihtiyacım var - Bilmiyorum. PixelFormat'ı sahip olduğunuz gibi belirtmeyi denedim, ancak dosya türünün saydamlıkla GIF olduğu zaman hatalara neden oluyor gibi görünüyordu. Ve aslında, bazı varyasyonlar PixelFormat belirtmeden PNG'lerle iyi çalışıyor gibi görünüyordu. –

+0

@JonathanWood eski bitmap'in genişliğini ve yüksekliğini ve istediğiniz yeni biçimini kullanarak yeni bir bitmap oluşturun. Tercihen bir 'using' ifadesinde bir Graphics nesnesi oluşturun: FromImage (' 'yeni bitmap'''' ve 'DrawImage (' 'eski bitmap'''''''. –

İlgili konular