2009-04-15 14 views
9

मैं निम्नानुसार एक छवि का आकार बदलने की कोशिश कर रहा हूं। मैं आकार की छवि को byte[] में वापस कर देता हूं ताकि मैं इसे डेटाबेस में संग्रहीत कर सकूं। पीएनजी छवि की पारदर्शिता खो गई है। इसे बेहतर बनाने में मदद करें।एक पीएनजी छवि का आकार बदलना क्यों पारदर्शिता खो देता है?

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

उत्तर

7

.MakeTransparent() अपने बिटमैप ऑब्जेक्ट पर कॉल करने का प्रयास करें।

+0

हां। यहां तक ​​कि काम नहीं किया। –

+0

हां !!! यह काम करता हैं! आप मुझे बचा लीजिए! छवि का आकार बदलने या फसल के प्रत्येक चरण पर .MakeTransparent() का उपयोग करना महत्वपूर्ण है। एक नई छवि() बनाने के बाद। धन्यवाद! –

+0

इस मेकट्रांस्पेरेंट कॉल में किस ऑब्जेक्ट में है? –

23

आपका कोड काफी आप क्या सोचते हैं कि यह करता है नहीं करता है ...

आप GetThumbnailImage छवि का आकार करने के लिए उपयोग, तो आप अपने आप में थंबनेल छवि आकर्षित जो बल्कि व्यर्थ है। आप शायद पहले चरण में पारदर्शिता खो देते हैं।

इसके बजाय एक खाली बिटमैप बनाएं, और इसे रिक्त बिटमैप पर खींचकर स्रोत छवि का आकार बदलें।

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

(मैं कुछ मानकों कि कुछ भी है कि imageLen पैरामीटर है कि केवल एक बाइट सरणी कि कभी इस्तेमाल नहीं हुआ बनाने के लिए इस्तेमाल किया गया था की तरह, परिणाम से कोई लेना देना था के लिए इस्तेमाल नहीं किया गया हटा दिया।)

+0

यह समाधान मुझे एक पारदर्शी छवि भी नहीं देता है। –

+0

मैंने इसे पीएनजी -8 और पीएनजी -24 छवियों दोनों के साथ करने की कोशिश की, और यह पारदर्शिता को सुरक्षित रखता है। क्या आप उस छवि को पोस्ट कर सकते हैं जिसे आप आकार बदलने का प्रयास कर रहे हैं? – Guffa

+0

ठीक है अगर मैं test.png को देखता हूं तो यह पारदर्शिता को सुरक्षित रखता है। लेकिन अगर मैं डेटाबेस में बाइट [] स्टोर करता हूं और इसे पुनः एक्सेस करता हूं, तो उस छवि को मेरे वेब पेज पर लोड करने का प्रयास करें, तो पृष्ठभूमि ग्रे के रूप में प्रदर्शित होती है। लेकिन यह तब मामला नहीं था जब मैं बिना छवि के सीधे डेटाबेस में छवि लोड कर रहा था। –

2

हो सकता है आप कुछ इस तरह करना चाहिए क्योंकि इस बात मेरे लिए काम किया:

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); 
} 
संबंधित मुद्दे