2012-05-06 27 views
11

मेरे पास मेरे डब्ल्यूपीएफ एप्लिकेशन के अंदर एक छवि नियंत्रण है, जिसमें इसके अंदर एक बड़ी छवि है, लेकिन नियंत्रण केवल 60x150 है, इसका मतलब है कि यह केवल इसका एक निश्चित भाग दिखाता है छवि। दृश्य भाग को फ़ाइल में सहेजने का सबसे आसान तरीका क्या है?wpf को सहेजने का सबसे आसान तरीका फ़ाइल पर छवि नियंत्रण

आपकी मदद के लिए धन्यवाद।

[संपादित करें] मैं कोड पाया here का उपयोग कर (जो मैं यहाँ पोस्ट करने से पहले पता लगाने में सक्षम नहीं किया गया) समाप्त हो गया ...

Grid r = new Grid(); 
     r.Background = new ImageBrush(image2.Source); 


    System.Windows.Size sz = new System.Windows.Size(image2.Source.Width, image2.Source.Height); 
    r.Measure(sz); 
    r.Arrange(new Rect(sz)); 

    RenderTargetBitmap rtb = new RenderTargetBitmap((int)image2.Source.Width, (int)image2.Source.Height, 96d, 96d, PixelFormats.Default); 
    rtb.Render(r); 

    BmpBitmapEncoder encoder = new BmpBitmapEncoder(); 
    encoder.Frames.Add(BitmapFrame.Create(rtb)); 

    FileStream fs = File.Open(@"C:\lol.png", FileMode.Create); 
    encoder.Save(fs); 
    fs.Close(); 
+0

image2.Source.Width क्या है? यह image2.ActualWidth इसके बजाय, बस मेरे कोड का उपयोग करें। – gliderkite

उत्तर

16

आप RenderTargetBitmap वर्ग और BitmapEncoder इस्तेमाल कर सकते हैं।

परिभाषित इन तरीकों:

void SaveToBmp(FrameworkElement visual, string fileName) 
{ 
    var encoder = new BmpBitmapEncoder(); 
    SaveUsingEncoder(visual, fileName, encoder); 
} 

void SaveToPng(FrameworkElement visual, string fileName) 
{ 
    var encoder = new PngBitmapEncoder(); 
    SaveUsingEncoder(visual, fileName, encoder); 
} 

// and so on for other encoders (if you want) 


void SaveUsingEncoder(FrameworkElement visual, string fileName, BitmapEncoder encoder) 
{ 
    RenderTargetBitmap bitmap = new RenderTargetBitmap((int)visual.ActualWidth, (int)visual.ActualHeight, 96, 96, PixelFormats.Pbgra32); 
    bitmap.Render(visual); 
    BitmapFrame frame = BitmapFrame.Create(bitmap); 
    encoder.Frames.Add(frame); 

    using (var stream = File.Create(fileName)) 
    { 
     encoder.Save(stream); 
    } 
} 

आप इस तरह एक कंटेनर के अंदर अपने Image नियंत्रण है, तो:

<Grid x:Name="MyGrid"> 
    <Image Name="MyImage" Stretch="None"></Image> 
</Grid> 

तुम बस ऐसा करने की आवश्यकता:

SaveToPng(MyGrid, "image.png"); 

नहीं तो आप जब आप RenderTargetBitmap का उपयोग करते हैं तो आप केवल इच्छित आयामों को पारित कर सकते हैं:

SaveToPng(MyImage, "image.png"); 

... 

RenderTargetBitmap bitmap = new RenderTargetBitmap(YourWidth, YourHeight, 96, 96, PixelFormats.Pbgra32); 
+4

इसके लिए धन्यवाद, यह एक शानदार मुद्दे के लिए शानदार नहीं होगा .. सहेजी गई छवि पिच ब्लैक है ... कोई विचार यह कैसे हुआ या इसे कैसे ठीक किया जाए? – Meh

+0

जब मैं अपना कोड चलाता हूं तो यह काम करता है, आपने क्या प्रयास किया है? "माईग्रिड" या "माईमेज" के साथ? – gliderkite

+0

मैंने वीबी.नेट में एक टेस्ट प्रोजेक्ट किया है: [यहां यह एक नमूना है] (http://ideone.com/wZH72) अगर यह मदद कर सकता है; और [यहां] (http://ideone.com/CJrJA) एक्सएएमएल। – gliderkite

2

मैं उसी 'काले' छवि मुद्दे में भाग गया जो कि ग्लाइडरकाइट के समाधान का उपयोग करते समय किया गया था। 'ब्लैक' छवि फ्रेमवर्क एलिमेंट के मार्जिन के कारण प्रतीत होती है क्योंकि इसे कैप्चर की गई छवि के बाहर प्रस्तुत किया जाता है। मुझे comment on Rick Stahl's blog

विशेष रूप से, प्रतिपादन से पहले मापने और व्यवस्थित करने से यह कार्य में पाया गया है कि तस्वीर में कोई मार्जिन नहीं है। निम्नलिखित एक स्थिर वर्ग है जिसे अब मैं स्क्रीन कैप्चर के लिए पुनः उपयोग करता हूं। यह ग्लाइडरकाइट के उत्तर और रिक स्टाहल के ब्लॉग पर जानकारी के आधार पर है।

public static class ScreenCapture 
{ 
    public static void SaveToBmp(FrameworkElement visual, string fileName) 
    { 
     var encoder = new BmpBitmapEncoder(); 
     SaveUsingEncoder(visual, fileName, encoder); 
    } 

    public static void SaveToPng(FrameworkElement visual, string fileName) 
    { 
     var encoder = new PngBitmapEncoder(); 
     SaveUsingEncoder(visual, fileName, encoder); 
    } 

    public static void SaveToJpeg(FrameworkElement visual, string fileName) 
    { 
     var encoder = new JpegBitmapEncoder(); 
     SaveUsingEncoder(visual, fileName, encoder); 
    } 

    private static void SaveUsingEncoder(FrameworkElement visual, string fileName, BitmapEncoder encoder) 
    { 
     RenderTargetBitmap bitmap = new RenderTargetBitmap((int)visual.ActualWidth, (int)visual.ActualHeight, 96, 96, PixelFormats.Pbgra32); 
     Size visualSize = new Size(visual.ActualWidth, visual.ActualHeight); 
     visual.Measure(visualSize); 
     visual.Arrange(new Rect(visualSize)); 
     bitmap.Render(visual); 
     BitmapFrame frame = BitmapFrame.Create(bitmap); 
     encoder.Frames.Add(frame); 

     using (var stream = File.Create(fileName)) 
     { 
      encoder.Save(stream); 
     } 
    } 
}