2016-03-15 21 views
6

में छवि को कॉपी और आकार बदलने के लिए मैंने प्रोग्राम्सैटिक रूप से छवियों का आकार बदलने के लिए http://www.codeproject.com/Tips/552141/Csharp-Image-resize-convert-and-save से कोड का उपयोग किया है। हालांकि, वह परियोजना System.Drawing पुस्तकालयों का उपयोग करती है, जो विंडोज 10 अनुप्रयोगों के लिए उपलब्ध नहीं हैं।विंडोज 10 यूडब्ल्यूपी

मैं बजाय Windows.UI.Xaml.Media.Imaging से BitmapImage वर्ग का उपयोग कर की कोशिश की है, लेकिन यह कार्यक्षमता है कि System.Drawing में पाया गया था की पेशकश नहीं लगता है ..

किसी को भी (नीचे पैमाने पर) छवियों में आकार बदलने के लिए सक्षम होने के लिए किसी भी किस्मत ने किया है विंडोज 10? मेरा आवेदन विभिन्न प्रारूपों/आकारों में कई स्रोतों से छवियों को संसाधित करेगा, और मैं एप्लिकेशन को आकार देने के बजाय वास्तविक छवियों को आकार बदलने के लिए वास्तविक छवियों का आकार बदलने की कोशिश कर रहा हूं, जिसमें इसे प्रदर्शित किया जा रहा है।

संपादित

मैं उपर्युक्त लिंक से संशोधित किया है, और एक हैक जो मेरे विशिष्ट जरूरत के लिए काम करता है। संदेश यह है:

public static BitmapImage ResizedImage(BitmapImage sourceImage, int maxWidth, int maxHeight) 
{ 
    var origHeight = sourceImage.PixelHeight; 
    var origWidth = sourceImage.PixelWidth; 
    var ratioX = maxWidth/(float) origWidth; 
    var ratioY = maxHeight/(float) origHeight; 
    var ratio = Math.Min(ratioX, ratioY); 
    var newHeight = (int) (origHeight * ratio); 
    var newWidth = (int) (origWidth * ratio); 

    sourceImage.DecodePixelWidth = newWidth; 
    sourceImage.DecodePixelHeight = newHeight; 

    return sourceImage; 
} 

इस तरह से काम करने लगता है, लेकिन आदर्श नहीं बल्कि मूल BitmapImage को संशोधित करने से, मैं इसके बारे में एक नया/कॉपी को संशोधित करने और बजाय वापस जाने के लिए बनाने के लिए करना चाहते हैं। screenshot of resized image

+0

भ्रामक शीर्षक, ओपी। आपके पास छवि का आकार बदलने का एक तरीका है, आप वास्तव में क्या करना चाहते हैं मूल छवि की एक प्रति बनाते हैं, प्रति का आकार बदलते हैं, फिर प्रतिलिपि वापस लेते हैं। –

+0

@BrianDriscoll मैंने संपादन से पहले प्रश्न पोस्ट किया था। संपादन ने मूल छवि का आकार बदलने के लिए कोड जोड़ा। मैं इसे एक उत्तर के रूप में पोस्ट करता, लेकिन यह अभी तक काफी लंबा नहीं रहा है। लेकिन मुझे नया खिताब पसंद है। धन्यवाद। –

+0

क्या आप छवि को स्थिर बनाने में सक्षम हैं? या एक निजी संपत्ति आप बस छवि की मूल प्रतिलिपि का संदर्भ दे सकते हैं और एक ही समारोह का उपयोग कर सकते हैं? – aguertin

उत्तर

7

मैं नहीं बल्कि मूल को संशोधित करने की तुलना में मूल BitmapImage की एक प्रति वापस करना चाहते हो सकता है:

यहाँ कार्रवाई में इसके बारे में एक शॉट है।

कोई अच्छा तरीका सीधे एक BitmapImage कॉपी करने के लिए नहीं है, लेकिन हम कई बार के लिए StorageFile का पुन: उपयोग कर सकते हैं।

तुम सिर्फ एक चित्र का चयन करें, यह दिखाने के लिए और इस बीच मूल एक की फिर से आकार के चित्र दिखाने में करना चाहते हैं, तो आप इस तरह पैरामीटर के रूप में StorageFile पारित कर सकते हैं:

public static async Task<BitmapImage> ResizedImage(StorageFile ImageFile, int maxWidth, int maxHeight) 
{ 
    IRandomAccessStream inputstream = await ImageFile.OpenReadAsync(); 
    BitmapImage sourceImage = new BitmapImage(); 
    sourceImage.SetSource(inputstream); 
    var origHeight = sourceImage.PixelHeight; 
    var origWidth = sourceImage.PixelWidth; 
    var ratioX = maxWidth/(float)origWidth; 
    var ratioY = maxHeight/(float)origHeight; 
    var ratio = Math.Min(ratioX, ratioY); 
    var newHeight = (int)(origHeight * ratio); 
    var newWidth = (int)(origWidth * ratio); 

    sourceImage.DecodePixelWidth = newWidth; 
    sourceImage.DecodePixelHeight = newHeight; 

    return sourceImage; 
} 

इस परिदृश्य में आप sourceImage की तरह एक संशोधित बिटमैप हो सकता है, लेकिन सीधे फ़ाइल से लोड नहीं

smallImage.Source = await ResizedImage(file, 250, 250); 

आप BitmapImage पैरामीटर रखना चाहते हैं कुछ कारणों की वजह से (: बस इस कार्य को फोन करके इस तरह फिर से आकार की छवि दिखाने की जरूरत है), और आप टी चाहते हैं o इस नई तस्वीर को दूसरे आकार में दोबारा आकार दें, आपको फिर से आकार की तस्वीर को पहले फ़ाइल के रूप में सहेजने की आवश्यकता होगी, फिर इस फ़ाइल को खोलें और इसे दोबारा आकार दें।

+0

यह उत्कृष्ट है, धन्यवाद ग्रेस।क्या बेस बिट स्ट्रिंग में एन्कोडिंग के लिए 'बिटमैप इमेज' या 'आईआरएमएंडएपस्ट्रीम' को 'लिखितबल बिटमैप' या 'रेंडरटाइटल बिटमैप' में लाने का कोई तरीका है? मैं सीधे 'स्टोरेजफ़ाइल' करने में सक्षम हूं, लेकिन चूंकि आकार की छवि 'स्टोरेजफ़ाइल' नहीं है, इसलिए मुझे इसे एन्कोडिंग के लिए एक अलग डेटा प्रकार में वापस लाने की आवश्यकता है। –

+0

मैंने 'बिटमैप छवि 'के बजाय' लिखित योग्य बिटमैप 'का उपयोग करने के लिए पूरी प्रक्रिया को बदलना समाप्त कर दिया ताकि मेरे पास बेस 64 पर एन्कोडिंग के लिए आवश्यक प्रारूप में छवि हो। मूल आयाम प्राप्त करने के लिए मुझे अभी भी 'ResizedImage' फ़ंक्शन के अंदर 'बिटमैप छवि' बनाना है, लेकिन कम से कम यह काम करता है :) –

+0

@ डबस्टाइल, आप इसे सही तरीके से कर रहे हैं, मुझे' BitmapImage' 64base स्ट्रिंग के लिए। 'IRandomAccessStream' को 'लिखने योग्य बिटमैप' प्राप्त करने के लिए, आप' बिटमैप डिकोडर 'का उपयोग कर सकते हैं, लेकिन मुझे लगता है कि आप इसे पहले से ही जानते हैं। –

संबंधित मुद्दे