7

मैं एक विंडोज फोन 8.1 (आरटी) में संग्रहीत जीआईएफ फ़ाइल प्रदर्शित करने की कोशिश कर रहा हूं) एप्लिकेशन का स्थानीय फ़ोल्डर। अब तक, मैंने कई दृष्टिकोणों की कोशिश की है:विंडोज फोन 8.1 (आरटी) एप्लिकेशन में एनिमेटेड जीआईएफ कैसे प्रदर्शित करें?

  1. वेबव्यू नियंत्रण में जीआईएफ लोड करें। यह एक समाधान नहीं है क्योंकि मैं FlipView नियंत्रण में छवियों को प्रदर्शित करना चाहता हूं (मैं दूसरी छवि पर नहीं जा सकता)। इसके अलावा, यह काफी धीमी है।
  2. बिटमैपडेकोडर क्लास का उपयोग करके जीआईएफ फ्रेम प्राप्त करें और स्टोरीबोर्ड का उपयोग करके उन्हें एनिमेट करें।

using (var stream = await storageFile.OpenReadAsync()) 
    { 
     //I don't specify the type since I would like to load other type of images also 
     //It doesn't make any difference if I would use "BitmapDecoder.GifDecoderId" 

     var decoder = await BitmapDecoder.CreateAsync(stream); 
     uint frameCount = decoder.FrameCount; 

     for (uint frameIndex = 0; frameIndex < frameCount; frameIndex++) 
     { 
      var frame = await decoder.GetFrameAsync(frameIndex); 
      var writableBitmap = new WriteableBitmap((int)decoder.OrientedPixelWidth, 
                (int)decoder.OrientedPixelHeight); 

      var pixelDataProvider = await frame.GetPixelDataAsync 
       (BitmapPixelFormat.Bgra8, 
       decoder.BitmapAlphaMode, new BitmapTransform(), 
       ExifOrientationMode.IgnoreExifOrientation, 
       ColorManagementMode.DoNotColorManage); 

      var pixelData = pixelDataProvider.DetachPixelData(); 
      using (var pixelStream = writableBitmap.PixelBuffer.AsStream()) 
      { 
       pixelStream.Write(pixelData, 0, pixelData.Length); 
      } 

      _bitmapFrames.Add(writableBitmap); 
     } 
    } 

समस्या है कि फ्रेम मैं GIF छवि से मिलता अप

like this one

मैं कुछ में गलत कर रहा हूँ गड़बड़ कर रहे हैं:

कोड इस प्रकार है यह दृष्टिकोण? अच्छे नतीजे पाने के लिए मुझे क्या संशोधित करना चाहिए?

मैं SharpDX का उपयोग नहीं करना चाहूंगा क्योंकि यह बहुत जटिल लगता है और मैं शुरुआत कर रहा हूं।

ImageTools केवल सिल्वरलाइट

+0

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

+1

मैंने पृष्ठ पर MediaElement जोड़ने का प्रयास किया है और gif फ़ाइल को इसके स्रोत के रूप में सेट किया है। 'AreTransportControlsEnabled' को सत्य पर सेट करने के बाद, मैं' असमर्थित वीडियो प्रकार या अमान्य फ़ाइल पथ 'कहने में त्रुटि देख सकता था। साथ ही, जीआईएफ फ़ाइल का मार्ग सही ढंग से सेट किया गया है। – rhcpfan

+0

शपथ ले सकता था कि मैं इसे पहले इस्तेमाल करता था, शायद WP नहीं था? अगर मेरे पास समय है तो मैं इसके साथ टिंकर कर दूंगा। उसके लिए माफ़ करना। –

उत्तर

6

के लिए मैं एक बहुत बुनियादी GifImage नियंत्रण है कि आप से शुरू कर सकते हैं बनाया उपलब्ध है। यह एक शुरुआती बिंदु है, आपको इसे पुन: प्रयोज्य नियंत्रण के रूप में अधिक उपयोग करने योग्य बनाने के लिए इसे सुधारना होगा। इसे here देखें।

GifImage windows phone screenshot


संपादित

आप कैसे लोड हो रहा है गति (साथ में चलाना, आदि) में सुधार करने के लिए किसी भी विचार है?

मुझे लगता है कि आप फ्रेम तैयार करने की प्रक्रिया का जिक्र कर रहे हैं। मैंने जो परीक्षण किया है, वैसे भी यह तुरंत लोड हो रहा है, इसलिए कठोर प्रदर्शन सुधार की आवश्यकता नहीं होनी चाहिए। हालांकि, अगर एनीमेशन में सैकड़ों फ्रेम हैं, तो यह शायद एक बाधा हो सकती है? अनुकूलन आवश्यक हैं या नहीं, यह आकलन करने के लिए अधिक परीक्षण करने की आवश्यकता है।

मुझे यह भी नहीं लगता कि यह आसानी से समान हो सकता है क्योंकि प्रत्येक फ्रेम को पिछले फ्रेम से अनुक्रम में प्रस्तुत करने की आवश्यकता है। मेरा एकमात्र सुझाव पृष्ठभूमि थ्रेड पर लोडिंग कोड को चलाने के लिए होगा ताकि UI थ्रेड बड़ी छवियों के लिए अवरुद्ध न हो।

यदि मेरे पास FlipViewItem के रूप में यह नियंत्रण है, तो आइटम को फ़्लिप होने के बाद मैं स्मृति को कैसे छोड़ सकता हूं?

मुझे यकीन है कि क्या है या नहीं आप MVVM या नहीं का उपयोग कर रहे हैं, लेकिन वैसे भी नहीं कर रहा हूँ, यहाँ कुछ सुझाव है:

  • सेट GifImage की Source अगर यह वर्तमान में दृश्यमान नहीं है शून्य पर (निरीक्षण फ्लिप व्यू के SelectedIndex)। ध्यान दें कि वर्तमान में मेरे रेपो में कोड Source को शून्य पर सेट नहीं करता है। जैसा कि मैंने पहले कहा था, इसमें बहुत सारे सुधार की जरूरत है। आपको यह सुनिश्चित करना होगा कि नियंत्रण में फ्रेम के लिए कोई संदर्भ नहीं है ताकि कचरा कलेक्टर उन्हें स्मृति से मुक्त कर सके (यानी, फ्रेम के सभी संदर्भों को साफ़ करने के लिए animation.KeyFrames.Clear() पर कॉल करें)।
  • फ़्लिप दृश्य के अंदर VirtualizingStackPanel का उपयोग करें। यह सुनिश्चित करेगा कि केवल पिछले, वर्तमान, और अगले फ्लिप दृश्य आइटम स्मृति में बनाए गए हैं। आप इसे इस तरह सेट करें:
<FlipView> 
    <FlipView.ItemsPanel> 
     <ItemsPanelTemplate> 
      <VirtualizingStackPanel Orientation="Horizontal" /> 
     </ItemsPanelTemplate> 
    </FlipView.ItemsPanel> 
</FlipView> 
+0

आपके समाधान के लिए धन्यवाद! मैंने केवल मामूली परीक्षण किया है, लेकिन यह ठीक काम करता है। क्या आपको कोई विचार है कि लोडिंग गति (समांतरता, आदि) को कैसे सुधारें? इसके अलावा, अगर मेरे पास FlipViewItem के रूप में यह नियंत्रण है, तो आइटम को फ़्लिप होने के बाद मैं स्मृति को कैसे छोड़ सकता हूं? आपके समय के लिए फिर से धन्यवाद! – rhcpfan

2

मैं एक ऐसी ही समस्या थी। मैं विंडोज फोन 8.1 ऐप के लिए स्क्रॉलव्यूयर के अंदर बाहरी स्रोत से लोड एनिमेटेड जीआईएफ प्रदर्शित करने की कोशिश कर रहा था। चूंकि वेब नियंत्रण घटनाओं को लेता है क्योंकि स्क्रॉलिंग काम नहीं करती है।

मैंने इस चाल का उपयोग किया: मैंने वेब नियंत्रण को ग्रिड के अंदर रखा और वेबकंट पर एक और ग्रिड लगाया। वेब नियंत्रण पर ग्रिड सटीक आकार के रूप में सेट किया गया था और मैंने पृष्ठभूमि को पारदर्शी पर सेट किया था। इस तरह ग्रिड घटनाओं को प्राप्त करता है और स्क्रॉलिंग फिर से काम करता है।

<ScrollViewer Visibility="Visible" HorizontalAlignment="Left" VerticalAlignment="Top" Width="380"> 
    <Grid> 
     <StackPanel> 

      <!-- 
      Some items ... 
      --> 

      <Grid > 
       <WebView x:Name="animationWebView" HorizontalAlignment="Left" Height="315" Width="390" Visibility="Visible" /> 
       <Grid Width="390" Height="315" Background="Transparent" /> 
      </Grid> 

      <!-- 
      Some other items ... 
      --> 
     </StackPanel> 
    </Grid> 
</ScrollViewer> 
संबंधित मुद्दे