أكثر

شفافية خلفية IRasterLayer في C ++ مع ArcObjects 10.x .NET

شفافية خلفية IRasterLayer في C ++ مع ArcObjects 10.x .NET


لديّ IRasterLayer مُحدد جغرافيًا يعرض البيانات من ملف PPM بدون قناة ألفا. أحاول تحديد لون يجب التعامل معه على أنه شفاف. في ArcMap ، من الممكن تعيين لون معين ليكون شفافًا ، ولكن لا يزال يتعين علي العثور على مثال C ++ صالح لـ ArcObjects 10.x .NET.

أنا أستخدم واجهة C ++ COM وأحاول تحقيق ذلك من خلال إنشاء RasterRGBRenderer وفقًا لهذا المنشور. تمرر عينة VB.NET للعمل المطالب بها مجموعة من المضاعفات إلى IRasterStretch.BackgroundValues ​​غير متوافق مع واجهة 10.1 الموثقة.
للأسف ، فإن التوثيق في هذا المجال ضعيف ، وهذه العينات قديمة جدًا. لا تحدد الوثائق حتى نوع COM VARIANT المطلوب عند توقع VARIANTS.

يرجى تقديم المشورة حول كيفية تحديد شفافية الخلفية باستخدام C ++ في ArcObjects 10.x .NET

يحرر: كاختبار ، حاولت تعيين لون BackgroundValue الأبيض ليتم عرضه باللون الأحمر باستخدام ما يلي ، هذا لم ينجح (يعمل هذا على اختبار PNG بخلفية بيضاء ، ولكن ليس ملف PPM الخاص بي):

esri :: IRasterRGBRenderer2Ptr rgbRenderer ؛ rgbRenderer.CreateInstance (__ uuidof (esri :: RasterRGBRenderer)) ؛ IRasterRendererPtr rasterRenderer (rgbRenderer) ؛ rasterRenderer-> نقطية = طبقة نقطية-> نقطية ؛ hr = rasterLayer-> putref_Renderer (rasterRenderer) ؛ IRgbColorPtr backgroundColor ؛ backgroundColor.CreateInstance (__ uuidof (esri :: RgbColor)) ؛ backgroundColor-> put_RGB (RGB (255 ، 0 ، 0)) ؛ // أحمر لامع لاختبار CComSafeArray الخلفية backgroundValue.Create (3) ؛ backgroundValue.SetAt (0، 255.0) ، backgroundValue.SetAt (1، 255.0) ، backgroundValue.SetAt (2، 255.0) ، CComVariant varBackgroundValue (backgroundValue) ؛ امتداد IRasterStretch2Ptr (العارض النقطي) ؛ hr = stretch-> put_Background (VARIANT_TRUE) ؛ hr = stretch-> putref_BackgroundColor (backgroundColor) ؛ hr = stretch-> put_BackgroundValue (varBackgroundValue) ؛ rasterRenderer-> تحديث () ؛

يمكنني أن أؤكد أنه تم تعيين BackgroundValue بشكل صحيح. يؤدي استدعاء get_BackgroundValue دائمًا إلى إرجاع مصفوفة VARIANT من المضاعفات وتشمل هذه القيم الصحيحة إذا حصلت عليها بعد استدعاء put. تم التأكيد أيضًا على تعيين العارض بشكل صحيح كما لو قمت بتعطيل أحد النطاقات باستخدام مؤشر العارض المرئي بوضوح


لقد واجهت المشكلة في العام الماضي وكان علي أن أتعلم: إثبات الحلوى في الأكل: - o يختلف نوع القيمة لكل عارض ، في c # عليك إنشاء نوع من الكائن ووضع القيمة فيه مضاعفة أو صفيف مزدوج ... هذا أسوأ شيء ... بايت ربما يساعد مقتطف الشفرة الخاص بي قليلاً.

إذا كان (catLyrRenderer هو IRasterRGBRenderer) {object ob = null ؛ مزدوج [] colVals = مزدوج جديد [bands.Count] ؛ لـ (int i = 0 ؛ i 

يبدو أن هذا كان بسبب مشكلة التقريب داخل ESRI ، كما لو أن واجهة COM ستعيد دائمًا مجموعة من المضاعفات بغض النظر عن ما ترسله (وتعيين مجموعة من المضاعفات التي تعمل مع PNG يدوية الصنع) ، خلفية سيتغير ملف PPM الخاص بي فقط إذا تم تعيين BackgroundValue على مجموعة من int. في هذا التنسيق ، كان تحجيم RGB في النطاق الطبيعي 0-255 وكان إعداد الشفافية تافهًا مثل إنشاء IColor مع مجموعة الشفافية ، أو بدلاً من ذلك إعادة استخدام قيمة NoDataColor وفقًا لمشاركة شميدور. حل العمل:

esri :: IRasterRGBRenderer2Ptr rgbRenderer ؛ rgbRenderer.CreateInstance (__ uuidof (esri :: RasterRGBRenderer)) ؛ IRasterRendererPtr rasterRenderer (rgbRenderer) ؛ rasterRenderer-> نقطية = طبقة نقطية-> نقطية ؛ hr = rasterLayer-> putref_Renderer (rasterRenderer) ؛ esri :: IRasterDisplayPropsPtr displayProps (rasterRenderer) ؛ esri :: IColorPtr noDataColor ؛ hr = displayProps-> get_NoDataColor (& noDataColor) ؛ CComSafeArray الخلفية backgroundValue.Create (3) ؛ backgroundValue.SetAt (0، 255) ، backgroundValue.SetAt (1، 255) ، backgroundValue.SetAt (2، 255) ، CComVariant varBackgroundValue (backgroundValue) ؛ امتداد IRasterStretch2Ptr (العارض النقطي) ؛ hr = stretch-> put_Background (VARIANT_TRUE) ؛ hr = stretch-> putref_BackgroundColor (noDataColor) ؛ hr = stretch-> put_BackgroundValue (varBackgroundValue) ؛ rasterRenderer-> تحديث () ؛

شاهد الفيديو: ArcGIS Developer - Visual Studio and ArcObjects Tips and Tricks