4 votos

IRasterLayer transparencia de fondo en C++ con ArcObjects 10.x .NET

Tengo un georreferenciados IRasterLayer que muestra datos de una PPM de archivo sin canal alfa. Estoy tratando de especificar un color que deben ser tratados como transparente. En ArcMap, es posible establecer un color específico a ser transparentes, pero todavía tengo que encontrar un trabajo ejemplo de C++ para ArcObjects 10.x .NET.

Estoy usando el C++ interfaz COM y han estado tratando de lograr esto mediante la creación de un RasterRGBRenderer como por este post. La reivindica-trabajo VB.NET la muestra pasa una matriz de dobles en IRasterStretch.BackgroundValues que no es compatible con el documentado 10.1 de la interfaz.
Por desgracia, la documentación en esta área es pobre, y estas muestras son muy viejos. La documentación no especifica qué tipo de VARIANTE COM es necesaria cuando las VARIANTES que se espera.

Por favor, asesorar sobre cómo especificar la transparencia de fondo, el uso de C++ en ArcObjects 10.x .NET

Editar: Como una prueba de que he intentado establecer BackgroundValue blanco para mostrar como el rojo en la siguiente, este trabajo no lo hizo (Esto no funciona en una prueba PNG con fondo blanco, pero no es mi PPM archivo):

esri::IRasterRGBRenderer2Ptr rgbRenderer;
rgbRenderer.CreateInstance(__uuidof(esri::RasterRGBRenderer));
IRasterRendererPtr rasterRenderer(rgbRenderer);
rasterRenderer->Raster = rasterLayer->Raster;
hr = rasterLayer->putref_Renderer(rasterRenderer);

IRgbColorPtr backgroundColor;
backgroundColor.CreateInstance(__uuidof(esri::RgbColor));
backgroundColor->put_RGB(RGB(255, 0, 0)); // Bright red for testing

CComSafeArray<double> backgroundValue;
backgroundValue.Create(3);
backgroundValue.SetAt(0, 255.0);
backgroundValue.SetAt(1, 255.0);
backgroundValue.SetAt(2, 255.0);
CComVariant varBackgroundValue(backgroundValue);

IRasterStretch2Ptr stretch(rasterRenderer);
hr = stretch->put_Background(VARIANT_TRUE);
hr = stretch->putref_BackgroundColor(backgroundColor);
hr = stretch->put_BackgroundValue(varBackgroundValue);
rasterRenderer->Update();

Puedo confirmar que BackgroundValue se está establecida correctamente. Llamar get_BackgroundValue siempre devuelve una matriz VARIANTE de dobles y estos incluyen los valores correctos si me llega después de que me llame a poner. El procesador también es confirmado para ser configurado correctamente como si me desactivar una de las bandas utilizando el procesador puntero que es claramente visible

0voto

Brad Puntos 193

A los que me enfrentaba el problema del año pasado y tuvo que aprender: La prueba del budín está en comerlo :-o Para cada representador el tipo de valor es diferente, en c#, tendrá que crear un tipo de objeto y poner allí el valor doble o matriz de doble... este es un muy peor la cosa... por que tal vez mi fragmento de código ayuda un poco.

if (catLyrRenderer is IRasterRGBRenderer)
    {
      object ob = null;
      double[] colVals = new double[bands.Count];
      for (int i = 0; i < bands.Count; i++)
      {
        ob = raster2.GetPixelValue(i, col, row);
        if (ob != null) colVals[i] = (double)(byte)ob;
      }
      (catLyrRenderer as IRasterStretch2).Background = true;
      (catLyrRenderer as IRasterStretch2).BackgroundColor = ((IRasterDisplayProps)catLyrRenderer).NoDataColor;
      (catLyrRenderer as IRasterStretch2).BackgroundValue = colVals;
      catLyrRenderer.Update();
}   else if (catLyrRenderer is IRasterStretchColorRampRenderer)
            {
                object ob = null;
                ob = raster2.GetPixelValue(0, col, row);

                (catLyrRenderer as IRasterStretch2).Background = true;
                (catLyrRenderer as IRasterStretch2).BackgroundColor = ((IRasterDisplayProps)catLyrRenderer).NoDataColor;
                (catLyrRenderer as IRasterStretch2).BackgroundValue = ob;
                catLyrRenderer.Update();
            }

0voto

Paul Robinson Puntos 21

Parece que esto fue causado por un problema de redondeo dentro de ESRI, ya que aunque la interfaz COM siempre devolverá un array de doubles no importa lo que usted envía (y la configuración de una matriz de dobles trabajado para una hecha a mano PNG), el fondo de mi PPM archivo único cambio si el BackgroundValue se establece en un array de int. En este formato RGB escala fue en la normal de 0 a 255 rango y ajuste de la transparencia era tan trivial como la generación de una IColor con transparencia, o, alternativamente, re-uso de la NoDataColor valor como por schmiddor del post. Solución de trabajo:

esri::IRasterRGBRenderer2Ptr rgbRenderer;
rgbRenderer.CreateInstance(__uuidof(esri::RasterRGBRenderer));
IRasterRendererPtr rasterRenderer(rgbRenderer);
rasterRenderer->Raster = rasterLayer->Raster;
hr = rasterLayer->putref_Renderer(rasterRenderer);

esri::IRasterDisplayPropsPtr displayProps(rasterRenderer);
esri::IColorPtr noDataColor;
hr = displayProps->get_NoDataColor(&noDataColor);

CComSafeArray<int> backgroundValue;
backgroundValue.Create(3);
backgroundValue.SetAt(0, 255);
backgroundValue.SetAt(1, 255);
backgroundValue.SetAt(2, 255);
CComVariant varBackgroundValue(backgroundValue);

IRasterStretch2Ptr stretch(rasterRenderer);
hr = stretch->put_Background(VARIANT_TRUE);
hr = stretch->putref_BackgroundColor(noDataColor);
hr = stretch->put_BackgroundValue(varBackgroundValue);
rasterRenderer->Update();

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X