2010-07-20 11 views
12

से एक छवि ऑब्जेक्ट प्राप्त करना मुझे एक छवि (डेटाबेस में संग्रहीत) के लिए बाइट सरणी मिली है। मैं एक छवि वस्तु बनाना चाहता हूं, विभिन्न आकारों की कई छवियां बनाना चाहता हूं और उन्हें डेटाबेस में वापस संग्रहीत करना चाहता हूं (इसे वापस बाइट सरणी में सहेजें)।एक बाइट सरणी

मैं डेटाबेस भाग, या आकार बदलने के बारे में चिंतित नहीं हूं। लेकिन फ़ाइल सिस्टम में फ़ाइल को सहेजने के बिना छवि ऑब्जेक्ट को लोड करने का कोई आसान तरीका है, और फिर इसे आकार देने के बाद इसे बाइट सरणी में वापस रख दें? अगर मैं कर सकता हूं तो मैं इसे स्मृति में सब कुछ करना चाहता हूं।

Something like: 
Image myImage = new Image(byte[]); 
or 
myImage.Load(byte[]); 

उत्तर

20

आप एक MemoryStream का उपयोग करेंगे यह करने के लिए:

byte[] bytes; 
... 
using (var ms = new System.IO.MemoryStream(bytes)) { 
    using(var img = Image.FromStream(ms)) { 
     ... 
    } 
} 
+0

यह महान काम करेगा: और यहाँ एक से थोड़ा अधिक उन्नत समाधान है। क्या आप इसे बाइट सरणी में वापस लाने के तरीके के बारे में जानते हैं? आकार बदलने के बाद मुझे आकार बदलने वाली छवियों को डेटाबेस में वापस रखना होगा। –

+0

@Dan: कृपया इसे शामिल करने के लिए अपना प्रश्न संपादित करें। –

+0

मुझे यह मिला :) धन्यवाद छवि। सहेजें (स्ट्रीम, छविफॉर्मैट) - http://msdn.microsoft.com/en-us/library/ms142147.aspx –

2

एक और जवाब देने के लिए अपनी टिप्पणी के आधार पर, आप एक छवि है कि एक byte[] में संग्रह किया गया है तो लौटने पर एक परिवर्तन के प्रदर्शन के लिए इस कोशिश कर सकते हैं परिणाम byte[] के रूप में परिणाम।

public byte[] TransformImage(byte[] imageData) 
{ 
    using(var input = new MemoryStream(imageData)) 
    { 
     using(Image img = Image.FromStream(input)) 
     { 
      // perform your transformations 

      using(var output = new MemoryStream()) 
      { 
       img.Save(output, ImageFormat.Bmp); 

       return output.ToArray(); 
      } 
     } 
    } 
} 

यह आपको byte[] डेटाबेस में संग्रहीत में पास जो कुछ परिवर्तनों आप, फिर एक नया byte[] कि डेटाबेस में वापस संग्रहित किया जा सकता लौटना ही होगा प्रदर्शन करने के लिए अनुमति देगा।

0

मैंने सोचा कि मैं इसे और अधिक दृश्यमान बनाने के लिए इसे एक उत्तर के रूप में जोड़ दूंगा।

एक बाइट सरणी के लिए इसे वापस बचत के साथ:

public Image localImage; 
    public byte[] ImageBytes; 

    public FUU_Image(byte[] bytes) 
    { 
     using (MemoryStream ImageStream = new System.IO.MemoryStream(bytes)) 
     { 
      localImage = Image.FromStream(ImageStream); 
     } 

     localImage = ResizeImage(localImage); 

     using (MemoryStream ImageStreamOut = new MemoryStream()) 
     { 
      localImage.Save(ImageStreamOut, ImageFormat.Jpeg); 
      ImageBytes = ImageStreamOut.ToArray(); 
     } 

    } 
+0

arbiter की टिप्पणी का पुनरुत्पादन: ResizeImage ब्लॉक का उपयोग कर छविस्ट्रीम के अंदर होना चाहिए, क्योंकि स्थानीय इमेज को कॉल करने से पहले छविस्ट्रीम तक पहुंच की आवश्यकता हो सकती है, और आपको ResizeImage द्वारा स्थानीय (संभवतः नया?) स्थानीय इमेज का निपटान करना चाहिए। – Douglas

2

केवल प्रश्न की पहली छमाही का जवाब दे: यहाँ एक एक लाइनर समाधान है कि एक बाइट सरणी है कि एक की एक छवि शामिल साथ मेरे लिए ठीक काम करता है है जेपीईजी फ़ाइल।

Image x = (Bitmap)((new ImageConverter()).ConvertFrom(jpegByteArray)); 

संपादित करें: https://stackoverflow.com/a/16576471/253938