2010-09-19 17 views
15

मेरे समस्या यह है कि छवि लोड आवेदन संसाधनों से uncorrectly हो रहा है है। इस कोड है:लोड हो रहा है छवि - गलत चौड़ाई और ऊंचाई

BitmapImage bi = new BitmapImage(); 
    bi.BeginInit(); 
    bi.UriSource = new Uri(@"pack://application:,,,/WpfApplication3;component/Resources/Images/16x16_incorrect.png", UriKind.Absolute); 
    bi.EndInit(); 

    ImageSource s = bi; 

छवि फ़ाइल "16x16_incorrect.png" है 16x16 32bpp PNG फ़ाइल, लेकिन कोड ऊपर को क्रियान्वित करने के बाद, s.Width = s.Height = 21,59729 .... मैं भी एक और फ़ाइल है - "16x16_correct.png", जब मैं इसे उसी तरह लोड करता हूं, तो छवि स्रोत की चौड़ाई और ऊंचाई दोनों 16,002 के बराबर होती है।

मैं उपयोगी पीएनजी 16x16 32bpp छवियों, जो मैं अपने ऐप्स के UI में उपयोग करना चाहते हैं का एक बड़ा पैक है। दुर्भाग्यवश, उनमें से प्रत्येक गलत तरीके से लोड हो रहा है & धुंधला (या चिकनी) दिखता है, क्योंकि सिस्टम इसे 16x16 से 21x21 तक फैलाता है।

  • सही छवि: Correct Image
  • गलत छवि: Incorrect Image

आप के रूप में इस समस्या के संभावित समाधान समझाने के लिए तो कृपया होना चाहेंगे? अगर स्रोत छवि फ़ाइलों में समस्या है, तो मैं इस फाइल का उपयोग करने के लिए ImageSource.Width को वांछित आकार में कैसे बदल सकता हूं?

उत्तर

11

आप (96 डीपीआई के लिए छवि संकल्प सेट करने के लिए वर्तमान में की जरूरत है गलत पीएनजी के लिए यह 71.12 है)।

आप छवि मेनू का चयन कैनवास आकार से मुक्त paint.net कार्यक्रम (http://getpaint.net) का उपयोग कर यह करने के और 96

6

यह छवियों के डीपीआई के कारण है। डब्ल्यूपीएफ 96 डीपीआई के साथ डिफ़ॉल्ट प्रस्तुत करता है। यदि आप गलत पीएनजी छवि के डीपीआई को देखते हैं। आप देखेंगे कि यह 72 पर सेट है। इससे डब्ल्यूपीएफ छवि को 96 डीपीआई तक स्केल करने और मूल आकार रखने का कारण बनता है।

दो समाधान कर रहे हैं। आप कर सकते हैं:

  1. , उदा: शुल्क का उपयोग कर डीपीआई को संशोधित करें। यह 96
  2. 16 चौड़ाई और ऊंचाई गुण सेट करने के लिए सेट करें, और वर्दी के लिए मांसपेशियों को संपत्ति

    <Grid> 
    <Grid.RowDefinitions> 
        <RowDefinition /> 
        <RowDefinition /> 
        <RowDefinition /> 
    </Grid.RowDefinitions> 
    <Image x:Name="MyIncorrectImageFixed" Source="http://i.piccy.info/i5/24/41/504124/16x16_incorrect.png" Width="16" Height="16" Stretch="Uniform" /> 
    <Image x:Name="MyIncorrectImage" Source="http://i.piccy.info/i5/24/41/504124/16x16_incorrect.png" Stretch="None" Grid.Row="1" /> 
    <Image x:Name="MyCorrectImage" Source="http://i.piccy.info/i5/22/41/504122/16x16_correct.png" Stretch="None" Grid.Row="2" /> 
    

+1

धन्यवाद, धन्यवाद। :) – JSP

+0

दूसरा समाधान डीपीआई को बिल्कुल भी नहीं बदलता है, यह सिर्फ मूल छवि को (समान रूप से) कंटेनर को भर देगा जो धुंधली छवि का कारण बन सकता है। –

+0

वास्तव में, प्रश्न में उदाहरण के लिए मुझे लगता है कि इससे थोड़ा अंतर आएगा। – hkon

17

करने के लिए "संकल्प" फ़ील्ड सेट आप डीपीआई बाहर से बदलने के लिए आप कर सकते हैं नहीं करना चाहते हैं कर सकते हैं इस के साथ यह है: जैसे मैंने किया था

public static BitmapSource ConvertBitmapTo96DPI(BitmapImage bitmapImage) 
{ 
    double dpi = 96; 
    int width = bitmapImage.PixelWidth; 
    int height = bitmapImage.PixelHeight; 

    int stride = width * bitmapImage.Format.BitsPerPixel; 
    byte[] pixelData = new byte[stride * height]; 
    bitmapImage.CopyPixels(pixelData, stride, 0); 

    return BitmapSource.Create(width, height, dpi, dpi, bitmapImage.Format, null, pixelData, stride); 
} 

आप कुछ कर सकते हैं तो आप सिर्फ में Image.Source.Width/ऊंचाई सही मान की जरूरत है:

this.myImage.Tag = new double[] { bitmapImage.DpiX, bitmapImage.DpiY }; 
this.myImage.Source = bitmapImage; 

और आर इसे इस तरह से एसाइज़ करें:

public static void ResizeImage(Image img, double maxWidth, double maxHeight) 
{ 
    if (img == null || img.Source == null) 
     return; 

    double srcWidth = img.Source.Width; 
    double srcHeight = img.Source.Height; 

    // Set your image tag to the sources DPI value for smart resizing if DPI != 96 
    if (img.Tag != null && img.Tag.GetType() == typeof(double[])) 
    { 
     double[] DPI = (double[])img.Tag; 
     srcWidth = srcWidth/(96/DPI[0]); 
     srcHeight = srcHeight/(96/DPI[1]); 
    } 

    double resizedWidth = srcWidth; 
    double resizedHeight = srcHeight; 

    double aspect = srcWidth/srcHeight; 

    if (resizedWidth > maxWidth) 
    { 
     resizedWidth = maxWidth; 
     resizedHeight = resizedWidth/aspect; 
    } 
    if (resizedHeight > maxHeight) 
    { 
     aspect = resizedWidth/resizedHeight; 
     resizedHeight = maxHeight; 
     resizedWidth = resizedHeight * aspect; 
    } 

    img.Width = resizedWidth; 
    img.Height = resizedHeight; 
} 
+4

आपकी डीपीआई विधि उधार ली, धन्यवाद। पुनर्भुगतान के लिए, एक बगफिक्स (मूल काम नहीं करेगा, उदाहरण के लिए, बी/डब्ल्यू टीआईएफ के साथ)। – Will

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