2009-04-15 29 views
9

Bir resmi aşağıdaki gibi yeniden boyutlandırmaya çalışıyorum. Yeniden boyutlandırılan resmi byte[]'a döndürerek veritabanında saklayabilirim. Png görüntüsünün şeffaflığı kaybolur. Bunu daha iyi hale getirmek için lütfen yardım edin.Png görüntüsünü yeniden boyutlandırma neden şeffaflığı kaybediyor?

private byte[] GetThumbNail(string imageFile, Stream imageStream, 
    int imageLen) 
{ 
    try 
    { 
    Image.GetThumbnailImageAbort imageCallBack = 
     new Image.GetThumbnailImageAbort(ThumbnailCallback); 
    Bitmap getBitmap = new Bitmap(imageFile); 
    byte[] returnByte = new byte[imageLen]; 
    Image getThumbnail = getBitmap.GetThumbnailImage(160, 59, 
     imageCallBack, IntPtr.Zero); 
    using (Graphics g = Graphics.FromImage(getThumbnail)) 
    { 
     g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias; 
     g.InterpolationMode = 
     System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic; 
     g.DrawImage(getThumbnail, 0, 0, 160, 59); 
    } 
    using (MemoryStream ms = new MemoryStream()) 
    { 
     getThumbnail.Save(ms, ImageFormat.Png); 
     getThumbnail.Save("test.png", ImageFormat.Png); 
     returnByte = ms.ToArray(); 
    } 
    return returnByte; 
    } 
    catch (Exception) 
    { 
    throw; 
    } 
} 

cevap

7

Bitmap nesnesindeki .MakeTransparent() numaralı telefonu kullanmayı deneyin.

+0

Evet. Bu bile işe yaramadı. –

+0

Evet! İşe yarıyor! Beni kurtardın! Resize yeniden boyutlandırmak veya kırpmak için her adımda .MakeTransparent() kullanılması önemlidir. Yeni bir Görüntü oluşturduktan sonra(). Teşekkür ederim! –

+0

Bu Nesnede Hangi nesne var? –

23

Kodunuz mu olduğunu düşündüğünü oldukça yapmaz ...

Sen GetThumbnailImage görüntüyü yeniden boyutlandırmak için kullanın, o zaman oldukça anlamsız olan kendi içine küçük resim çizin. Muhtemelen ilk adımda şeffaflığı kaybedersiniz.

Bunun yerine boş bir bitmap oluşturun ve kaynak görüntüyü boş bitmap'e çizerek yeniden boyutlandırın.

private byte[] GetThumbNail(string imageFile) { 
    try { 
    byte[] result; 
    using (Image thumbnail = new Bitmap(160, 59)) { 
     using (Bitmap source = new Bitmap(imageFile)) { 
     using (Graphics g = Graphics.FromImage(thumbnail)) { 
      g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias; 
      g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic; 
      g.DrawImage(source, 0, 0, 160, 59); 
     } 
     } 
     using (MemoryStream ms = new MemoryStream()) { 
     thumbnail.Save(ms, ImageFormat.Png); 
     thumbnail.Save("test.png", ImageFormat.Png); 
     result = ms.ToArray(); 
     } 
    } 
    return result; 
    } catch (Exception) { 
    throw; 
    } 
} 

(Ben sadece hiç kullanılmamıştır bir bayt dizisi oluşturmak için kullanılan imageLen parametresi gibi, sonuçla ilgisi olduğunu herhangi bir şey için hiç kullanılmamış bazı parametreler kaldırıldı.)

+0

Bu çözüm ayrıca bana şeffaf bir görüntü vermiyor. –

+0

Hem PNG-8 hem de PNG-24 görüntüleri ile denedim ve saydamlığı koruyor. Yeniden boyutlandırmaya çalıştığınız resmi yükleyebilir misiniz? – Guffa

+0

Eğer test.png'ye bakarsam şeffaflığı korur. Ancak, bayt [] 'ı veritabanında depolayıp yeniden eriştiğimde, bu resmi web sayfama yüklemeyi dener ve arka plan gri olarak görüntülenir. Ama bu görüntü resmini doğrudan veritabanına yeniden yerleştirmeksizin yüklediğimde durum böyle değildi. –

2

bu şey benim için çalıştı çünkü böyle bir şey yapması gerektiğini olabilir:

String path = context.Server.MapPath("/images"); 
if (!path.EndsWith("\\")) 
    path += "\\"; 
path += "none.png"; 

Image img = CreateThumbnail(Image.FromFile(path)); 

MemoryStream ms = new MemoryStream(); 
img.Save(ms, ImageFormat.Png); 
ms.WriteTo(context.Response.OutputStream); 

private System.Drawing.Image CreateThumbnail(System.Drawing.Image i) 
{ 
    int dWidth = i.Width; 
    int dHeight = i.Height; 
    int dMaxSize = 150; 

    if (dWidth > dMaxSize) 
    { 
     dHeight = (dHeight * dMaxSize)/dWidth; 
     dWidth = dMaxSize; 
    } 
    if (dHeight > dMaxSize) 
    { 
     dWidth = (dWidth * dMaxSize)/dHeight; 
     dHeight = dMaxSize; 
    } 
    return i.GetThumbnailImage(dWidth, dHeight, delegate() { return false; }, IntPtr.Zero); 
}