ThinkGeo.com    |     Documentation    |     Premium Support

Alpha channel on GeoImages

    Hi guys,


 I'm trying to apply some kind of transparency to certain features on the map so they do not distract from the highlighted ones. With either the custom LineStyle and PointStyle I can do it easily as GeoColor used in the Pens or the GeoSolidBrush respectively support Alpha channel value, but how can I modify it on a GeoImage used by my icons?


Carlos. 



Carlos,


Please try the following code in your application:


 



 GdiPlusRasterLayer rasterLayer = new GdiPlusRasterLayer(@"..\..\SampleData\Data\World.tif");
rasterLayer.UpperThreshold = double.MaxValue;
rasterLayer.LowerThreshold = 0;
rasterLayer.Open();
RectangleShape extent = rasterLayer.GetBoundingBox();
int width = rasterLayer.ImageSource.GetImageWidth();
int height = rasterLayer.ImageSource.GetImageHeight();

rasterLayer.Transparency = 122;
GeoImage image = rasterLayer.ImageSource.GetImage(extent, width, height);
rasterLayer.Close();
You can use the Transparency property of GdiPlusRasterLayer class to get the GeoImage object, Any more questions please let us know,


Thanks,


Scott,



Hi Scot, 
  
  Is there any way to do it from an InMemory image instead of from a disk file? the GdiPlusRasterLayer constructor only accepts filenames. 
  
  Thanks in advance. 
  
 Carlos.

Carlos,


There is a sample that names LoadAMapFromStreams.cs, it shows how to load a file to memory and deal with it. Please notice, in that sample, it uses the shape file as the sample data, you just need to change a little code in the sample, please refer the following code:


 



 GdiPlusRasterLayer rasterLayer = new GdiPlusRasterLayer(YourRasterLayerFilePath);
            rasterLayer.StreamLoading += new EventHandler<StreamLoadingEventArgs>(LoadAMapFromStreams_StreamLoading);

Any more questions please let me know,


Thanks,


Scott,



I have a sneaky suspicion that Carlos is refering to GeoImages that are used to create his PointStyle.  In this case, the only way I see you doing this is:



- Modify original image's transparency using an Image Editor such as Paint.NET ( I am assuming they are PNG)  


or


- Load image in memory, manipulate its transparency before creating GeoImage for PointStyle.   I am sure there is a .NET API that will allow you do this.


 



Hi Klaus, you are right, I just need to be able to adapt the transparency of my PointStyle GeoImages on the fly. 
  
  I’ll look for a .NET API  for doing the job as you suggest, and I will need to create a kind of IconCache so no need to process them many times is required. 
  
  I was asking because it was strange that there is no way within the API for doing it. 


 Yes, I recall you creating unique icons based on your feature attributes so this made sense.  Definitely consider using an IconCache as this processing may not be cheap.  I am currently doing something similar by an image's pixel grid based on feature attributes so I have to cache these manipulated images so that this operation is only done once.  In my case though, images are single color with transparent background.


If you images are PNG, you can try this:


 



// BitMap is the PNG you have loaded in memory
public static PointStyle CreatePictureMarkerSymbol(Bitmap bitmap)
        {
            if (bitmap == null) return null;

            var size = bitmap.Size;
            int width = size.Width;
            int height = size.Height;                                      

            System.Drawing.Color color;
            for (int i = 0; i < width; i++)   
            {
                for (int j = 0; j < height; j++)
                {
                    color = bitmap.GetPixel(i, j);
                    if (color != System.Drawing.Color.Empty)
// Experiment with the transparency.  here it it set to 100
                        bitmap.SetPixel(i, j, System.Drawing.Color.FromArgb(100, color.R, color.G, color.B));                  
                }
            }

            var imageStream = new MemoryStream();
            bitmap.Save(imageStream, System.Drawing.Imaging.ImageFormat.Png);
            imageStream.Seek(0, SeekOrigin.Begin);
            var geoImage = SymbolFactory.GetGeoImage(imageStream);              
            PointStyle style = new PointStyle(geoImage);                                  
            return style;
        }


Klaus, let me call you Master from now on ;) 
  
  It’s just what I needed! I was obfuscated looking for an “Alpha”/“Transparency” .NET function, and did not thought on the simle SetPixel one. 
  
  Thanks a million.

Always glad to help.



Gentlemen, 
  
 I am glad you find the solution, thanks for your sharing, you make the forum active and brilliant. 
  
 Hope you will keep sharing your knowledege and you will become MVPs. 
  
 Thanks, 
  
 James