কীভাবে চিত্রকে বাইট অ্যারেতে রূপান্তর করা যায়


125

কেউ কীভাবে পরামর্শ দিতে পারে যে আমি কীভাবে কোনও চিত্রকে বাইট অ্যারে এবং তার বিপরীতে রূপান্তর করতে পারি?

আমি একটি ডাব্লুপিএফ অ্যাপ্লিকেশন বিকাশ করছি এবং একটি স্ট্রিম রিডার ব্যবহার করছি।

উত্তর:


174

কোনও চিত্রকে বাইট অ্যারেতে পরিবর্তন করতে নমুনা কোড

public byte[] ImageToByteArray(System.Drawing.Image imageIn)
{
   using (var ms = new MemoryStream())
   {
      imageIn.Save(ms,imageIn.RawFormat);
      return  ms.ToArray();
   }
}

সি # চিত্র থেকে বাইট অ্যারে এবং বাইট অ্যারে চিত্র রূপান্তরকারী শ্রেণিতে


12
পরিবর্তে System.Drawing.Imaging.ImageFormat.Gif, আপনি ব্যবহার করতে পারেনimageIn.RawFormat
S.Serpooshan

1
এটি পুনরাবৃত্তিযোগ্য বলে মনে হয় না, বা রূপান্তরিত হওয়ার কমপক্ষে কয়েকবার পরে, অদ্ভুত জিডিআই + ত্রুটি ঘটতে শুরু করে। ImageConverterসমাধান নীচে পাওয়া এই ত্রুটিগুলি এড়ানোর বলে মনে হয়।
ডেভ কাজিনো

এখন থেকে পিএনজি ব্যবহার করা আরও ভাল।
নাইয়ারগডস

একদিকে নোটে: এতে অতিরিক্ত মেটা ডেটা থাকতে পারে যা আপনার কাছে নেই ;-) মেটাডেটা থেকে মুক্তি পেতে আপনি একটি নতুন বিটম্যাপ তৈরি করতে এবং চিত্রটি পছন্দ করতে পছন্দ করতে পারেন (new Bitmap(imageIn)).Save(ms, imageIn.RawFormat);
মার্কাস সাফার

56

একটি চিত্র অবজেক্টে রূপান্তর করার জন্য byte[]আপনি নীচের মতো করতে পারেন:

public static byte[] converterDemo(Image x)
{
    ImageConverter _imageConverter = new ImageConverter();
    byte[] xByte = (byte[])_imageConverter.ConvertTo(x, typeof(byte[]));
    return xByte;
}

4
নিখুঁত উত্তর! .... "ইমেজ ফাইল এক্সটেনশন" সংজ্ঞায়িত করার দরকার নেই, ঠিক আমি যা খুঁজছিলাম।
ব্রাভো

1
একদিকে নোটে: এতে অতিরিক্ত মেটা ডেটা থাকতে পারে যা আপনার কাছে নেই ;-) মেটাডেটা থেকে মুক্তি পেতে আপনি একটি নতুন বিটম্যাপ তৈরি করতে এবং চিত্রটি পছন্দ করতে পছন্দ করতে পারেন.ConvertTo(new Bitmap(x), typeof(byte[]));
মার্কাস সাফার

1
আমার জন্য ভিজ্যুয়াল স্টুডিও চিত্র-রূপান্তরকারী প্রকারটি স্বীকৃতি দিচ্ছে না। এটি ব্যবহার করার জন্য কি কোনও আমদানির বিবৃতি রয়েছে?
টেকনোমান 23

32

চিত্রের পথ থেকে বাইট অ্যারে পাওয়ার আরেকটি উপায় হ'ল

byte[] imgdata = System.IO.File.ReadAllBytes(HttpContext.Current.Server.MapPath(path));

তাদের প্রশ্নটি ডাব্লুপিএফকে ট্যাগ করা হয়েছে (সুতরাং এটি কোনও সার্ভারে চলছে এবং কোনও ম্যাপপথ অন্তর্ভুক্ত রয়েছে এমন ভাবার কোনও কারণ নেই) এবং তাদের দেখায় যে তাদের ইতিমধ্যে ছবিটি রয়েছে (এটি ডিস্ক থেকে পড়ার কারণ নেই, এমনকি এটি ডিস্কের সাথে শুরু করার জন্যও ধরে নেই)। আমি দুঃখিত তবে আপনার উত্তরটি প্রশ্নের সাথে সম্পূর্ণ অপ্রাসঙ্গিক বলে মনে হচ্ছে
রোনান থাইবাডাউ

18

আমি বর্তমানে যা ব্যবহার করছি তা এখানে। আমি চেষ্টা করেছি এমন অন্যান্য কৌশলগুলির মধ্যে কিছু অপ-অনুকূল হয়েছে কারণ তারা পিক্সেলের বিট গভীরতা (24-বিট বনাম 32-বিট) পরিবর্তন করেছে বা চিত্রটির রেজোলিউশন (ডিপিআই) উপেক্ষা করেছে।

  // ImageConverter object used to convert byte arrays containing JPEG or PNG file images into 
  //  Bitmap objects. This is static and only gets instantiated once.
  private static readonly ImageConverter _imageConverter = new ImageConverter();

বাইট অ্যারেতে চিত্র:

  /// <summary>
  /// Method to "convert" an Image object into a byte array, formatted in PNG file format, which 
  /// provides lossless compression. This can be used together with the GetImageFromByteArray() 
  /// method to provide a kind of serialization / deserialization. 
  /// </summary>
  /// <param name="theImage">Image object, must be convertable to PNG format</param>
  /// <returns>byte array image of a PNG file containing the image</returns>
  public static byte[] CopyImageToByteArray(Image theImage)
  {
     using (MemoryStream memoryStream = new MemoryStream())
     {
        theImage.Save(memoryStream, ImageFormat.Png);
        return memoryStream.ToArray();
     }
  }

ছবিতে বাইট অ্যারে:

  /// <summary>
  /// Method that uses the ImageConverter object in .Net Framework to convert a byte array, 
  /// presumably containing a JPEG or PNG file image, into a Bitmap object, which can also be 
  /// used as an Image object.
  /// </summary>
  /// <param name="byteArray">byte array containing JPEG or PNG file image or similar</param>
  /// <returns>Bitmap object if it works, else exception is thrown</returns>
  public static Bitmap GetImageFromByteArray(byte[] byteArray)
  {
     Bitmap bm = (Bitmap)_imageConverter.ConvertFrom(byteArray);

     if (bm != null && (bm.HorizontalResolution != (int)bm.HorizontalResolution ||
                        bm.VerticalResolution != (int)bm.VerticalResolution))
     {
        // Correct a strange glitch that has been observed in the test program when converting 
        //  from a PNG file image created by CopyImageToByteArray() - the dpi value "drifts" 
        //  slightly away from the nominal integer value
        bm.SetResolution((int)(bm.HorizontalResolution + 0.5f), 
                         (int)(bm.VerticalResolution + 0.5f));
     }

     return bm;
  }

সম্পাদনা করুন: একটি জেপিজি বা পিএনজি ফাইল থেকে চিত্রটি পেতে আপনার ফাইলটি ফাইল বাইট অ্যারেতে ফাইল পড়তে হবে eআরআডএলবাইটস ():

 Bitmap newBitmap = GetImageFromByteArray(File.ReadAllBytes(fileName));

এটি বিটম্যাপ সম্পর্কিত উত্স সম্পর্কিত সমস্যাগুলি এড়াতে চায় যা এর উত্স স্ট্রিমটি উন্মুক্ত রাখতে চায় এবং কিছু লোক সেই সমস্যার জন্য কার্যকর পরামর্শ দেয় যার ফলে উত্স ফাইলটি লক করে রাখা হয়।


এটির পরীক্ষার সময় আমি ফলস্বরূপ বিটম্যাপটি নিয়ে এটিকে আবার বাইট অ্যারে ব্যবহার করে ফিরিয়ে আনতাম: ImageConverter _imageConverter = new ImageConverter(); lock(SourceImage) { return (byte[])_imageConverter.ConvertTo(SourceImage, typeof(byte[])); } যেখানে এটি মাঝেমধ্যে 2 টি বিভিন্ন আকারের অ্যারে তৈরি করে। এটি প্রায় 100 টি পুনরাবৃত্তির পরে ঘটবে, তবে আমি যখন বিটম্যাপটি ব্যবহার করে তা পেয়েছি new Bitmap(SourceFileName);এবং তারপরে কোডটি দিয়ে এটি চালিত হয় তবে তা ঠিক কাজ করে works
ডোন

@ ডন: আসলেই কোনও ভাল ধারণা নেই। কোন চিত্রগুলি ইনপুট হিসাবে একই আউটপুট ফলাফল না এটি কি সামঞ্জস্যপূর্ণ? আপনি কি আউটপুটটি পরীক্ষা করার চেষ্টা করেছেন যখন এটি প্রত্যাশার চেয়ে আলাদা হয় না কেন? অথবা সম্ভবত এটি সত্যিই গুরুত্বপূর্ণ নয় এবং কেউ কেবল "জিনিসগুলি ঘটে" তা গ্রহণ করতে পারে।
রেনিপেট

এটি ধারাবাহিকভাবে ঘটছিল। যদিও এর কারণ খুঁজে পাইনি। আমার মনে হচ্ছে এটি মেমরি বরাদ্দে 4 কে বাইট সীমানার সাথে কিছু করতে পারে। তবে তা সহজেই ভুল হতে পারে। আমি একটি বাইনারি ফর্ম্যাটারের সাথে একটি মেমরিস্ট্রিম ব্যবহার করতে শুরু করেছি এবং যাচাইকরণের জন্য 1000 বারের বেশি লুপ করে বিভিন্ন ফর্ম্যাট এবং আকারের 250 টিরও বেশি পরীক্ষামূলক চিত্রের সাথে পরীক্ষিত হিসাবে আমি খুব সামঞ্জস্য হতে সক্ষম হয়েছি। উত্তর দেওয়ার জন্য আপনাকে ধন্যবাদ।
ডন

17

এটা চেষ্টা কর:

public byte[] imageToByteArray(System.Drawing.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;
}

imageToByteArray (সিস্টেম.ড্রেইং.ইম্যাজ ইমেজ ইন) ইমেজ ইমেজ পথ বা অন্য কিছু যা আমরা এতে চিত্র কীভাবে পাস করতে পারি
শশাঙ্ক

বাইট অ্যারে বা পিছনে কোনও চিত্র রূপান্তর করার জন্য আমি যে কোনও সময় এটি করি।
অ্যালেক্স এসিলফি

আপনি স্মৃতি প্রবাহ বন্ধ করতে ভুলে গেছেন ... বিটিডব্লিউ এটি সরাসরি থেকে অনুলিপি করা হয়েছে: লিংক
কিওয়ার্টি 01

1
@ কিওয়ার্টি01 কলিং ডিসপোজ MemoryStreamকমপক্ষে বর্তমান প্রয়োগে, কোনও দ্রুত দ্বারা ব্যবহৃত মেমরি পরিষ্কার করবে না । প্রকৃতপক্ষে, আপনি যদি এটি বন্ধ করেন তবে আপনি Imageপরে ব্যবহার করতে পারবেন না , আপনি একটি জিডিআই ত্রুটি পাবেন।
সায়েব আমিনী

14

File.ReadAllBytes()বাইট অ্যারেতে কোনও ফাইল পড়তে আপনি পদ্ধতিটি ব্যবহার করতে পারেন । বাইট অ্যারে ফাইলে লিখতে, কেবল File.WriteAllBytes()পদ্ধতিটি ব্যবহার করুন ।

আশাকরি এটা সাহায্য করবে.

আপনি এখানে আরও তথ্য এবং নমুনা কোড পেতে পারেন ।


কেবলমাত্র একটি পার্শ্ব নোট: এটিতে অতিরিক্ত মেটা ডেটা থাকতে পারে যা আপনি চান না ;-)
মার্কাস সাফার

1
হতে পারে. আমি এই উত্তরটি 10 ​​বছর আগে লিখেছিলাম, আমি তখন ফ্রেশ / নুব ছিলাম।
শেখর

5

আপনি কি পিক্সেল বা পুরো চিত্রটি (শিরোনাম সহ) বাইট অ্যারে হিসাবে চান?

পিক্সেলের জন্য: CopyPixelsবিটম্যাপে পদ্ধতিটি ব্যবহার করুন । কিছুটা এইরকম:

var bitmap = new BitmapImage(uri);

//Pixel array
byte[] pixels = new byte[width * height * 4]; //account for stride if necessary and whether the image is 32 bit, 16 bit etc.

bitmap.CopyPixels(..size, pixels, fullStride, 0); 

3

কোড:

using System.IO;

byte[] img = File.ReadAllBytes(openFileDialog1.FileName);

1
কেবলমাত্র যদি সে কোনও ফাইল পড়তে থাকে তবেই কাজ করে (এবং তারপরেও সে বিন্যাসিত / সংকুচিত বাইটগুলি পেয়েছে, এটি কোনও বিএমপি না থাকলে কাঁচা নয়)
ব্র্যাডলিডটনেট

3

আপনি যদি স্ট্রিমটিতে বাইট বহন করতে ইমেজবাইটসকে উল্লেখ না করেন তবে পদ্ধতিটি কোনও কিছুই ফিরিয়ে দেবে না। আপনি ইমেজবাইটসকে রেফারেন্স করুন তা নিশ্চিত করুন = m.ToArray ();

    public static byte[] SerializeImage() {
        MemoryStream m;
        string PicPath = pathToImage";

        byte[] imageBytes;
        using (Image image = Image.FromFile(PicPath)) {

            using ( m = new MemoryStream()) {

                image.Save(m, image.RawFormat);
                imageBytes = new byte[m.Length];
               //Very Important    
               imageBytes = m.ToArray();

            }//end using
        }//end using

        return imageBytes;
    }//SerializeImage

[এনবি] আপনি যদি এখনও ব্রাউজারটিতে চিত্রটি না দেখতে পান তবে আমি একটি সমস্যা সমাধানের একটি বিশদ পদক্ষেপ লিখেছিলাম

মীমাংসিত! -iis নয় সার্ভিং-সিএসএস, -images-এবং-জাভাস্ক্রিপ্ট


1

এটি কোনও ধরণের চিত্র (উদাহরণস্বরূপ পিএনজি, জেপিজি, জেপিজি) বাইট অ্যারে রূপান্তর করার জন্য কোড

   public static byte[] imageConversion(string imageName){            


        //Initialize a file stream to read the image file
        FileStream fs = new FileStream(imageName, FileMode.Open, FileAccess.Read);

        //Initialize a byte array with size of stream
        byte[] imgByteArr = new byte[fs.Length];

        //Read data from the file stream and put into the byte array
        fs.Read(imgByteArr, 0, Convert.ToInt32(fs.Length));

        //Close a file stream
        fs.Close();

        return imageByteArr
    }

কেবলমাত্র একটি পার্শ্ব নোট: এটিতে অতিরিক্ত মেটা ডেটা থাকতে পারে যা আপনি চান না ;-)
মার্কাস সাফার

0

বাইট অ্যারেতে ছবিটি রূপান্তর করতে code নীচে কোডটি দেওয়া হল।

public byte[] ImageToByteArray(System.Drawing.Image images)
{
   using (var _memorystream = new MemoryStream())
   {
      images.Save(_memorystream ,images.RawFormat);
      return  _memorystream .ToArray();
   }
}

বাইট অ্যারেটিকে ছবিতে রূপান্তর করতে To কোডটি নীচে দেওয়া হয়েছে code কোডটি A Generic error occurred in GDI+চিত্র সংরক্ষণে হ্যান্ডেল করা হয়।

public void SaveImage(string base64String, string filepath)
{
    // image convert to base64string is base64String 
    //File path is which path to save the image.
    var bytess = Convert.FromBase64String(base64String);
    using (var imageFile = new FileStream(filepath, FileMode.Create))
    {
        imageFile.Write(bytess, 0, bytess.Length);
        imageFile.Flush();
    }
}

-2

এই কোডটি এসকিউএলসিভার ২০১২-এ টেবিল থেকে প্রথম 100 টি সারি পুনরুদ্ধার করে এবং স্থানীয় ডিস্কে ফাইল হিসাবে সারি প্রতি চিত্র সংরক্ষণ করে

 public void SavePicture()
    {
        SqlConnection con = new SqlConnection("Data Source=localhost;Integrated security=true;database=databasename");
        SqlDataAdapter da = new SqlDataAdapter("select top 100 [Name] ,[Picture] From tablename", con);
        SqlCommandBuilder MyCB = new SqlCommandBuilder(da);
        DataSet ds = new DataSet("tablename");
        byte[] MyData = new byte[0];
        da.Fill(ds, "tablename");
        DataTable table = ds.Tables["tablename"];
           for (int i = 0; i < table.Rows.Count;i++ )               
               {
                DataRow myRow;
                myRow = ds.Tables["tablename"].Rows[i];
                MyData = (byte[])myRow["Picture"];
                int ArraySize = new int();
                ArraySize = MyData.GetUpperBound(0);
                FileStream fs = new FileStream(@"C:\NewFolder\" + myRow["Name"].ToString() + ".jpg", FileMode.OpenOrCreate, FileAccess.Write);
                fs.Write(MyData, 0, ArraySize);
                fs.Close();
               }

    }

দয়া করে নোট করুন: নিউফোল্ডারের নামের সাথে ডিরেক্টরিটি সি: in এ থাকা উচিত


3
আপনি ভুল প্রশ্নের উত্তর দিয়েছেন ... ঠিক আছে, আমি আশা করি ^ _ ^
জিবিডুব্লেভ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.