2009-04-15 29 views
9

Tôi đang cố định lại kích thước hình ảnh như sau. Tôi trả lại hình ảnh đã đổi kích thước thành byte[] để tôi có thể lưu trữ nó trong cơ sở dữ liệu. Độ trong suốt của hình ảnh png bị mất. Xin vui lòng giúp đỡ để làm cho điều này tốt hơn.Tại sao thay đổi kích thước hình ảnh png mất tính minh bạch?

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; 
    } 
} 

Trả lời

7

Hãy thử sử dụng cuộc gọi .MakeTransparent() trên đối tượng bitmap của bạn.

+0

Yes. Ngay cả công việc đó cũng không thành công. –

+0

Có !!! Nó hoạt động! Bạn Lưu Tôi! Điều quan trọng là sử dụng .MakeTransparent() trên mỗi bước thay đổi kích thước hình ảnh hoặc cắt. Sau khi bạn tạo một hình ảnh mới(). Cảm ơn bạn! –

+0

Đối tượng nào có lệnh gọi MakeTransparent này? –

23

Mã của bạn không làm khá những gì bạn nghĩ rằng nó ...

Bạn sử dụng GetThumbnailImage để thay đổi kích thước hình ảnh, sau đó bạn vẽ hình ảnh thu nhỏ vào chính nó mà là khá vô nghĩa. Bạn có thể mất tính minh bạch trong bước đầu tiên.

Tạo bitmap trống thay thế và đổi kích thước hình ảnh nguồn bằng cách vẽ hình ảnh đó trên bitmap trống.

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; 
    } 
} 

(Tôi đã gỡ bỏ một số thông số mà không bao giờ được sử dụng cho bất cứ điều gì có liên quan gì đến kết quả, như tham số imageLen đã được chỉ được sử dụng để tạo ra một mảng byte mà chưa bao giờ sử dụng.)

+0

Giải pháp này cũng không cho tôi hình ảnh minh bạch. –

+0

Tôi đã thử nó với cả hình ảnh PNG-8 và PNG-24, và nó giữ được độ trong suốt. Bạn có thể đăng hình ảnh mà bạn đang cố gắng thay đổi kích cỡ không? – Guffa

+0

Vâng, nếu tôi nhìn vào test.png nó vẫn giữ được độ trong suốt. Nhưng nếu tôi lưu trữ byte [] trong cơ sở dữ liệu và truy cập lại nó, hãy thử tải hình ảnh đó lên trang web của tôi thì nền được hiển thị dưới dạng màu xám. Nhưng đây không phải là trường hợp khi tôi tải hình ảnh trực tiếp vào cơ sở dữ liệu mà không cần phải đóng lại. –

2

có thể bạn nên làm một cái gì đó như thế này vì điều này đã làm việc cho tôi:

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); 
} 
Các vấn đề liên quan