2011-03-01 11 views
6

में SharpDX में एक छवि लोड/निर्माण करना मैं DirectX का उपयोग कर एक साधारण भूलभुलैया-जैसी 2 डी प्रोग्राम बनाने के लिए SharpDX का उपयोग करने का प्रयास कर रहा हूं।एक .NET प्रोग्राम

कि अंत मैं बिटमैप्स कि मैं भूलभुलैया के बाहर की दीवारों, हॉल के लिए ऑन-स्क्रीन प्रदान कर सकते हैं, बनाना चाहते हैं, आदि

हालांकि करने के लिए

, मैं कैसे करने के लिए या तो लोड यह पता लगाने नहीं कर पा रहे SharpDX लाइब्रेरी में बिटमैप क्लास में एक मौजूदा छवि फ़ाइल, या स्क्रैच से ऐसी नई बिटमैप क्लास कैसे बनाएं।

चूंकि सभी वर्गों को सीधे डायरेक्टएक्स प्रकारों पर मैप किया जाता है, मुझे लगता है कि इसका मतलब है कि मुझे और अधिक डायरेक्टएक्स सीखने की ज़रूरत है, लेकिन मुझे उम्मीद थी कि वहां एक साधारण उदाहरण था जो मुझे दिखा सकता है कि मुझे क्या करना है।

यदि मुझे स्क्रैच से एक नया बिटमैप बनाना है और इसे आकर्षित करना है, तो मैं ऐसा कर सकता हूं, मुझे पिक्सल को सही करने की आवश्यकता नहीं है, हालांकि मुझे उस हिस्से को भी समझना नहीं पड़ता है।

क्या किसी को SharpDX लाइब्रेरी के साथ कोई अनुभव है और मुझे कुछ पॉइंटर्स दे सकते हैं?

उत्तर

8

आपको सीधे इस प्रश्न को Sharpdx प्रोजेक्ट पर "समस्या" टैब पर पूछना चाहिए, क्योंकि मैं आपको वहां से त्वरित प्रतिक्रिया दे पाऊंगा (आप भाग्यशाली हैं कि मैं कभी-कभी नेट से इसका उपयोग जांच रहा हूं;))। यदि आप इसे आधिकारिक तौर पर पूछ रहे थे, तो मैं पुस्तकालय में सुधार कर सकता हूं और समस्या डेटाबेस में आपके अनुरोध का रिकॉर्ड रख सकता हूं।

अपने विशेष मुद्दे के बारे में, यह स्पष्ट नहीं है कि आप किस प्रकार का डायरेक्टएक्स एपीआई उपयोग कर रहे हैं। मुझे लगता है कि आप Direct2D का उपयोग कर रहे हैं?

यदि हां, तो फ़ाइल से सीधे SharpDX.Direct2D1. बिटमैप लोड करने के लिए कोई एपीआई नहीं है (मैं इस विधि को एपीआई में जोड़ दूंगा)। मैंने अभी एक bitmap sample अपलोड किया है जो यह कर रहा है।

/// <summary> 
/// Loads a Direct2D Bitmap from a file using System.Drawing.Image.FromFile(...) 
/// </summary> 
/// <param name="renderTarget">The render target.</param> 
/// <param name="file">The file.</param> 
/// <returns>A D2D1 Bitmap</returns> 
public static Bitmap LoadFromFile(RenderTarget renderTarget, string file) 
{ 
    // Loads from file using System.Drawing.Image 
    using (var bitmap = (System.Drawing.Bitmap)System.Drawing.Image.FromFile(file)) 
    { 
     var sourceArea = new System.Drawing.Rectangle(0, 0, bitmap.Width, bitmap.Height); 
     var bitmapProperties = new BitmapProperties(new PixelFormat(Format.R8G8B8A8_UNorm, AlphaMode.Premultiplied)); 
     var size = new System.Drawing.Size(bitmap.Width, bitmap.Height); 

     // Transform pixels from BGRA to RGBA 
     int stride = bitmap.Width * sizeof(int); 
     using (var tempStream = new DataStream(bitmap.Height * stride, true, true)) 
     { 
      // Lock System.Drawing.Bitmap 
      var bitmapData = bitmap.LockBits(sourceArea, ImageLockMode.ReadOnly, System.Drawing.Imaging.PixelFormat.Format32bppPArgb); 

      // Convert all pixels 
      for (int y = 0; y < bitmap.Height; y++) 
      { 
       int offset = bitmapData.Stride*y; 
       for (int x = 0; x < bitmap.Width; x++) 
       { 
        // Not optimized 
        byte B = Marshal.ReadByte(bitmapData.Scan0, offset++); 
        byte G = Marshal.ReadByte(bitmapData.Scan0, offset++); 
        byte R = Marshal.ReadByte(bitmapData.Scan0, offset++); 
        byte A = Marshal.ReadByte(bitmapData.Scan0, offset++); 
        int rgba = R | (G << 8) | (B << 16) | (A << 24); 
        tempStream.Write(rgba); 
       } 

      } 
      bitmap.UnlockBits(bitmapData); 
      tempStream.Position = 0; 

      return new Bitmap(renderTarget, size, tempStream, stride, bitmapProperties); 
     } 
    } 
} 

जैसा कि आपने कहा, SharpDX (विपरीत उदाहरण के लिए XNA कि एक उच्च स्तर एपीआई दे रहा है) कच्चे निम्न स्तर DirectX API तक पहुंच को दे रहा है, तो आप निश्चित रूप से समझने के लिए आदेश में कैसे इस कार्यक्रम कच्चे DirectX की जरूरत SharpDX का उपयोग करने के लिए।

0

वापस जब मैं स्लिम डीएक्स का उपयोग कर रहा था, तो मैं एक ही मुद्दे पर चला गया (डायरेक्ट 2 डी का उपयोग करके बिटमैप लोड करना) और एक समान समाधान मिला जो एम्बेडेड लूप से दूर है और थोड़ा कम कोड की आवश्यकता है; इसे SharpDX में परिवर्तित करना एक साधारण मामला था। (काश मैं आपको बता सकता हूं कि मुझे मूल कहां मिला, लेकिन यह साल हो गया है और स्पष्ट रूप से मैंने स्रोत को दस्तावेज नहीं किया है। यह मुझे पता है कि यह स्लिम डीएक्स नमूने से सीधे हो सकता है।)

मैंने नामस्थान छोड़े बरकरार है ताकि आप जान सकें कि प्रत्येक प्रकार को परिभाषित किया गया है। इसके अलावा, कुछ पैरामीटर (विशेष रूप से पिक्सेलफॉर्मैट के लिए) लचीले होते हैं; उनके साथ खेलें और जो भी काम करता है उसका उपयोग करें।

 
private Bitmap Load(string filename) 
{ 
    System.Drawing.Bitmap bmp = (System.Drawing.Bitmap)System.Drawing.Image.FromFile(filename); 

    System.Drawing.Imaging.BitmapData bmpData = 
     bmp.LockBits(
      new System.Drawing.Rectangle(0, 0, bmp.Width, bmp.Height), 
      System.Drawing.Imaging.ImageLockMode.ReadOnly, 
      System.Drawing.Imaging.PixelFormat.Format32bppPArgb); 

    SharpDX.DataStream stream = new SharpDX.DataStream(bmpData.Scan0, bmpData.Stride * bmpData.Height, true, false); 
    SharpDX.Direct2D1.PixelFormat pFormat = new SharpDX.Direct2D1.PixelFormat(SharpDX.DXGI.Format.B8G8R8A8_UNorm, AlphaMode.Premultiplied); 
    SharpDX.Direct2D1.BitmapProperties bmpProps = new SharpDX.Direct2D1.BitmapProperties(pFormat); 

    SharpDX.Direct2D1.Bitmap result = 
     new SharpDX.Direct2D1.Bitmap(
      m_renderTarget, 
      new SharpDX.Size2(bmp.Width, bmp.Height), 
      stream, 
      bmpData.Stride, 
      bmpProps); 

    bmp.UnlockBits(bmpData); 

    stream.Dispose(); 
    bmp.Dispose(); 

    return result; 
} 

आप देख सकते हैं, यह एलेक्जेंडर के दृष्टिकोण के रूप में बिटमैप धारा ज्यादा (जो जुड़े SharpDX नमूना परियोजना में इस्तेमाल किया जाता है) ताले, लेकिन इसके बजाय मैन्युअल रूप से प्रत्येक पिक्सेल, कॉपी करने के निर्माता खुद प्रतियां पर्दे के पीछे धारा । मैंने अलेक्जेंड्रे द्वारा प्रस्तावित विधि के साथ प्रदर्शन की तुलना नहीं की है, इसलिए मैं आपको यह नहीं बता सकता कि कौन सी विधि तेज है, लेकिन यह मेरे उद्देश्यों के लिए पर्याप्त तेज़ है, और कोड साफ़ है।

(वाक्य रचना हाइलाइटिंग की कमी के लिए क्षमा करें,। ​​किसी कारण से < कोड > टैग वर्गों में मेरी टुकड़ा टूट जाता है)

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