C # का उपयोग करना, क्या विंडोज Bitmap
को byte[]
अस्थायी फ़ाइल में सहेजने और परिणाम का उपयोग करके पढ़ने की तुलना में बेहतर तरीका है FileStream
?
C # का उपयोग करना, क्या विंडोज Bitmap
को byte[]
अस्थायी फ़ाइल में सहेजने और परिणाम का उपयोग करके पढ़ने की तुलना में बेहतर तरीका है FileStream
?
जवाबों:
कुछ तरीके हैं।
ImageConverter
public static byte[] ImageToByte(Image img)
{
ImageConverter converter = new ImageConverter();
return (byte[])converter.ConvertTo(img, typeof(byte[]));
}
यह सुविधाजनक है क्योंकि इसमें बहुत सारे कोड की आवश्यकता नहीं है।
मेमोरी स्ट्रीम
public static byte[] ImageToByte2(Image img)
{
using (var stream = new MemoryStream())
{
img.Save(stream, System.Drawing.Imaging.ImageFormat.Png);
return stream.ToArray();
}
}
यह जो आप कर रहे हैं उसके बराबर है, डिस्क को छोड़कर फ़ाइल को मेमोरी में सहेजा गया है। यद्यपि अधिक कोड आपके पास ImageFormat का विकल्प है और इसे मेमोरी या डिस्क में सहेजने के बीच आसानी से संशोधित किया जा सकता है।
ImageConverter
विधि Png के रूप में छवि को बचाएगा, जिसके परिणामस्वरूप बड़ी फ़ाइलें हैं।
ImageConverter
.net मानक आप उपयोग नहीं कर सकते हैंMemoryStream
इसके लिए एक मेमोरीस्ट्रीम मददगार हो सकती है। आप इसे विस्तार विधि में डाल सकते हैं:
public static class ImageExtensions
{
public static byte[] ToByteArray(this Image image, ImageFormat format)
{
using(MemoryStream ms = new MemoryStream())
{
image.Save(ms, format);
return ms.ToArray();
}
}
}
आप इसे बस इस्तेमाल कर सकते हैं:
var image = new Bitmap(10, 10);
// Draw your image
byte[] arr = image.ToByteArray(ImageFormat.Bmp);
मैं ImageConverter के संबंध में prestomanifto के जवाब से आंशिक रूप से असहमत हूं। ImageConverter का उपयोग न करें। इसके साथ तकनीकी रूप से कुछ भी गलत नहीं है, लेकिन बस यह तथ्य है कि यह बॉक्सिंग / ऑब्जेक्ट से बॉक्सिंग का उपयोग करता है, मुझे बताता है कि यह .NET फ्रेमवर्क के पुराने अंधेरे स्थानों से कोड है और छवि प्रसंस्करण के साथ उपयोग करने के लिए आदर्श नहीं है (यह बाइट में परिवर्तित करने के लिए ओवरकिल है। [] कम से कम), खासकर जब आप निम्नलिखित पर विचार करते हैं।
मैंने ImageConverter
.Net फ्रेमवर्क द्वारा उपयोग किए गए कोड पर एक नज़र डाली, और आंतरिक रूप से यह ऊपर दिए गए कोड के समान कोड का उपयोग करता है। यह एक नया बनाता है MemoryStream
, Bitmap
जब आपने इसे प्रदान किया था, तो जो भी प्रारूप में था उसे सहेजता है और सरणी देता है। ImageConverter
उपयोग करके कक्षा बनाने के अतिरिक्त ओवरहेड को छोड़ेंMemoryStream
आप सिर्फ मार्शल कर सकते हैं। बिटमैप डेटा को कॉपी करें। कोई मध्यस्थ मेमोरीस्ट्रीम आदि और एक तेज़ मेमोरी कॉपी नहीं। यह 24-बिट और 32-बिट बिटमैप दोनों पर काम करना चाहिए।
public static byte[] BitmapToByteArray(Bitmap bitmap)
{
BitmapData bmpdata = null;
try
{
bmpdata = bitmap.LockBits(new Rectangle(0, 0, bitmap.Width, bitmap.Height), ImageLockMode.ReadOnly, bitmap.PixelFormat);
int numbytes = bmpdata.Stride * bitmap.Height;
byte[] bytedata = new byte[numbytes];
IntPtr ptr = bmpdata.Scan0;
Marshal.Copy(ptr, bytedata, 0, numbytes);
return bytedata;
}
finally
{
if (bmpdata != null)
bitmap.UnlockBits(bmpdata);
}
}
।
एक MemoryStream में छवि सहेजें और फिर बाइट सरणी को पकड़ो।
http://msdn.microsoft.com/en-us/library/ms142148.aspx
Byte[] data;
using (var memoryStream = new MemoryStream())
{
image.Save(memoryStream, ImageFormat.Bmp);
data = memoryStream.ToArray();
}
System.Drawing.Image
(देखें: docs.microsoft.com/en-us/dotnet/api/… )
System.Drawing.Image does not exist
। तो .. नहीं, काम नहीं करता है :(
एक का प्रयोग करें MemoryStream
एक के बजाय FileStream
, इस तरह:
MemoryStream ms = new MemoryStream();
bmp.Save (ms, ImageFormat.Jpeg);
byte[] bmpBytes = ms.ToArray();
ToArray
, नहीं GetBuffer
।
Note that the buffer contains allocated bytes which might be unused. For example, if the string "test" is written into the MemoryStream object, the length of the buffer returned from GetBuffer is 256, not 4, with 252 bytes unused. To obtain only the data in the buffer, use the ToArray method.
तो अब बाइट सरणी से GetBuffer
इमेज के साथ-साथ अप्रयुक्त बाइट्स वापस आ जाएंगे, जिसके परिणामस्वरूप संभवतः एक भ्रष्ट छवि हो जाएगी।
निम्नलिखित आज़माएँ:
MemoryStream stream = new MemoryStream();
Bitmap bitmap = new Bitmap();
bitmap.Save(stream, ImageFormat.Jpeg);
byte[] byteArray = stream.GetBuffer();
सुनिश्चित करें कि आप उपयोग कर रहे हैं:
System.Drawing & using System.Drawing.Imaging;
MemoryStream ms = new MemoryStream();
yourBitmap.Save(ms, ImageFormat.Bmp);
byte[] bitmapData = ms.ToArray();
अधिक सरल:
return (byte[])System.ComponentModel.TypeDescriptor.GetConverter(pImagen).ConvertTo(pImagen, typeof(byte[]))
बस एक लाइन में बहुत सरल उपयोग:
byte[] imgdata = File.ReadAllBytes(@"C:\download.png");