ThinkGeo.com    |     Documentation    |     Premium Support

Background of GdiPlusGeoCanvas/GeoImage is black ?!

Hi,


I'm trying to draw layers onto a GeoImage using the GdiPlusGeoCanvas wrapper.


The layer drawing works fine, but the background of the image, i.e. the areas that isn't covered by layer drawing, is rendered black. I want it to be white.


So I used the GdiPlusGeoCanvas.FillBackground(), and that works if no layers are being drawn.


But if a single layer later is drawn on top of the GeoImage, the background turns black.


Can this be prevented in any way ?



'--- prereq.s:
Dim imageWidth As Integer 'set previously
Dim imageHeight As Integer 'set previously
Dim bbox(3) as Double 'set previously
Dim lyr as Layer 'set previously

'--- relevant code:
Dim mapExtent As New RectangleShape(bbox(0), bbox(3), bbox(2), bbox(1))
Dim myGeoImage As GeoImage = GdiPlusGeoCanvas.CreateGeoImage(imageWidth, imageHeight)
Dim myGdiPlusGeoCanvas As GdiPlusGeoCanvas = New GdiPlusGeoCanvas()

Try
    myGdiPlusGeoCanvas.BeginDrawing(myGeoImage, mapExtent, GeographyUnit.Meter)
    GdiPlusGeoCanvas.FillBackground(myGeoImage, New GeoSolidBrush(New GeoColor(255, 255, 255))) 'white background
    lyr.Open()
    SyncLock lyr
        lyr.Draw(myGdiPlusGeoCanvas, New Collection(Of SimpleCandidate)())
    End SyncLock
    lyr.Close()

Catch ex As Exception
    If myGdiPlusGeoCanvas.IsDrawing Then
        myGdiPlusGeoCanvas.EndDrawing()
    End If

Finally
    If myGdiPlusGeoCanvas.IsDrawing Then
        myGdiPlusGeoCanvas.EndDrawing()
    End If

End Try
 

Cheers.


 



Hi again,


I've made a work-around as shown below, which seem to work. 


But I would still like to log the errant behaviour as a bug, if that's what it is.



'applied after "FillBackground" and before any layers are drawn
Dim bg As New InMemoryFeatureLayer()
bg.Open()
With bg.FeatureSource
    .BeginTransaction()
    .AddFeature(New Feature(New RectangleShape(mapExtent.GetWellKnownText)))
    .CommitTransaction()
End With
With bg.ZoomLevelSet
    .ZoomLevel01.DefaultAreaStyle = AreaStyles.CreateSimpleAreaStyle(New GeoColor(255, 255, 255))
    .ZoomLevel01.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level20
End With
SyncLock bg
    bg.Draw(myGdiPlusGeoCanvas, New Collection(Of SimpleCandidate)())
End SyncLock
bg.Close()

Cheers.


 



Any acknowledgement of this bug (if it’s one such) being logged ? 


Hi Lars, 
  
 Thanks for your post. 
  
 In fact I discussed with our developer before about your problem, he thought if we change this, it will change the user behavior. We haven’t get a same result about this, so we haven’t set it as a bug till now. 
  
 I think we will discuss with this after he back from his vacation and update the status in this post. 
  
 Thanks for your post again. 
  
 Regards, 
  
 Don

Lars, 
  
   I am going to look into this while some of the guys are on vacation and see what I can drum up for you. 
  
 David

Lars,



  I have some information for you on this.  The core issue I believe is that the GeoImage format is TIFF and it has limited support for transparency.  The transparent area are being rendered as black.  What Don eluded to in his last post is that if we change the GeoImage to be something like PNG that support transparency then that might cause some incompatibilities.  We need to look further into that as we may be able to change to PNG and put a backward compatibility shim in for any old TIFF stiff we find.



  The good news is that there is another super easy way to do what you want and avoid GeoImage all together.  In the GdiPlusGeoCanvas.BeginDrawing method you can pass in a standard .Net bitmap instead of the GeoImage.  Doing that it will support full transparency.




Dim bitmap As New Bitmap(500, 500)
Dim gdiPlusGeoCanvas As New GdiPlusGeoCanvas()
gdiPlusGeoCanvas.BeginDrawing(bitmap, New RectangleShape(-155.733, 95.6, 104.42, -81.9),GeographyUnit.DecimalDegree);
 


David



Lars,



  I left out the code the set the background to white.



Dim bitmap As New Bitmap(500, 500)
Dim g As Graphics = Graphics.FromImage(bitmap)
g.Clear(Color.White)
g.Dispose()
 


David