c# - छवि रूपांतरण के लिए बाइट ऐरे




arrays byte (8)

मैं एक बाइट सरणी को एक छवि में परिवर्तित करना चाहता हूं।

यह मेरा डेटाबेस कोड है जहां से मुझे बाइट सरणी मिलती है:

public void Get_Finger_print()
{
    try
    {
        using (SqlConnection thisConnection = new SqlConnection(@"Data Source=" + System.Environment.MachineName + "\\SQLEXPRESS;Initial Catalog=Image_Scanning;Integrated Security=SSPI "))
        {
            thisConnection.Open();
            string query = "select pic from Image_tbl";// where Name='" + name + "'";
            SqlCommand cmd = new SqlCommand(query, thisConnection);
            byte[] image =(byte[]) cmd.ExecuteScalar();
            Image newImage = byteArrayToImage(image);
            Picture.Image = newImage;
            //return image;
        }
    }
    catch (Exception) { }
    //return null;
}

मेरा रूपांतरण कोड:

public Image byteArrayToImage(byte[] byteArrayIn)
{
    try
    {
        MemoryStream ms = new MemoryStream(byteArrayIn,0,byteArrayIn.Length);
        ms.Write(byteArrayIn, 0, byteArrayIn.Length);
        returnImage = Image.FromStream(ms,true);//Exception occurs here
    }
    catch { }
    return returnImage;
}

जब मैं किसी टिप्पणी के साथ लाइन तक पहुंचता हूं, तो निम्न अपवाद होता है: Parameter is not valid.

मैं इस अपवाद को उत्पन्न करने वाले किसी भी चीज़ को कैसे ठीक कर सकता हूं?


अधिकांश समय जब ऐसा होता है तो यह SQL कॉलम में खराब डेटा है। छवि कॉलम में डालने का यह सही तरीका है:

INSERT INTO [TableX] (ImgColumn) VALUES (
(SELECT * FROM OPENROWSET(BULK N'C:\....\Picture 010.png', SINGLE_BLOB) as tempimg))

ज्यादातर लोग गलत तरीके से ऐसा करते हैं:

INSERT INTO [TableX] (ImgColumn) VALUES ('C:\....\Picture 010.png'))

आप अपनी मेमोरी स्ट्रीम में दो बार लिख रहे हैं, आप भी उपयोग के बाद स्ट्रीम का निपटान नहीं कर रहे हैं। आप एम्बेडेड रंग सुधार लागू करने के लिए छवि डिकोडर से भी पूछ रहे हैं।

इसके बजाए इसे आजमाएं:

using (var ms = new MemoryStream(byteArrayIn))
{
    return Image.FromStream(ms);
}

कोशिश करें (अद्यतन)

MemoryStream ms = new MemoryStream(byteArrayIn,0,byteArrayIn.Length);
ms.Position = 0; // this is important
returnImage = Image.FromStream(ms,true);

नीचे के रूप में सरल दृष्टिकोण है, आप चाल करने के लिए छवि की FromStream विधि का उपयोग कर सकते हैं, बस सिस्टम का उपयोग करना याद रखें। ड्रॉइंग;

// using image object not file 
public byte[] imageToByteArray(Image imageIn)
{
MemoryStream ms = new MemoryStream();
imageIn.Save(ms,System.Drawing.Imaging.ImageFormat.Gif);
return ms.ToArray();
}

public Image byteArrayToImage(byte[] byteArrayIn)
{
MemoryStream ms = new MemoryStream(byteArrayIn);
Image returnImage = Image.FromStream(ms);
return returnImage;
}



सभी प्रस्तुत उत्तरों का मानना ​​है कि बाइट सरणी में एक ज्ञात फ़ाइल स्वरूप प्रतिनिधित्व में डेटा होता है, जैसे: gif, png या jpg। लेकिन मुझे हाल ही में byte[] एस को बदलने की कोशिश करने में एक समस्या थी, जिसमें रैखिक बीजीआरए जानकारी शामिल थी, जो Image वस्तुओं में कुशलतापूर्वक थी। निम्न कोड Bitmap ऑब्जेक्ट का उपयोग करके इसे हल करता है।

using System.Drawing;
using System.Drawing.Imaging;
using System.Runtime.InteropServices;
public static class Extensions
{
    public static Image ImageFromRawBgraArray(
        this byte[] arr, int width, int height)
    {
        var output = new Bitmap(width, height);
        var rect = new Rectangle(0, 0, width, height);
        var bmpData = output.LockBits(rect, 
            ImageLockMode.ReadWrite, output.PixelFormat);
        var ptr = bmpData.Scan0;
        Marshal.Copy(arr, 0, ptr, arr.Length);
        output.UnlockBits(bmpData);
        return output;
    }
}

यह इस समाधान पर पोस्ट किए गए समाधान की थोड़ी भिन्नता है।


public Image byteArrayToImage(byte[] bytesArr)
{
     MemoryStream memstr = new MemoryStream(bytesArr);
     Image img = Image.FromStream(memstr);
     return img;
}






bytebuffer