2008-05-26

GdiPlusX undocumented functions

The GdiPlusX library is intended to be compatible with the .net framework’s system.drawing namespace. that means that you can use the msdn online documentation for the “system.drawing” in order to obtain accurate information about the gdiplusx classes. objects and functions. more than that, you can also convert the huge amount of samples published in various forums, blogs, articles and e-magazines to be used in VFP. It really does not matter if the sample was published in VB, C or ASP. the conversion to VFP is really intuitive.
When GdiplusX was coded, we used a .net conversion tool, called reflector, which showed us all the source codes involved in each function, bringing us the possibility to code calling the same api functions, working with the same parameters.
But, during the coding phase, we had some great discussions about things that could be enhanced in order to ease user’s lives. We had a premise not changing the behavior of any function, even if we disagreed with some things there, in order to keep the full compatibility. On the other hand, we have decided that we could add new functions
Below is a short list of some functions that have been added to gdiplusx, that are not present in the .NET original classes. most of them have already been used in some samples posted in this blog, but till now, no documentation was published. so, here are some of those new functions, that came to my mind. probably bo or craig will remember to add something here. i hope to be updating this post with some other improvements that only VFP users have available.
Of course, we know that GdiPlusX still needs some documentation, and we’re working on it. But for now, we hope that the list below will bring you some help.


XfcGraphics class
DrawStringJustified Draws the specified text string at the specified location with the specified brush and font objects in a full justified format.
             Parameters: tcstring, ;                         tofont as xfcfont, ;                         tobrush as xfcbrush, ;                         torectangle as xfcrectangle
             Where:                         tcstring: text to be drawn                         tofont: gdi+x font object                         tobrush: gdi+x brush object                         torectangle: gdi+x rectangle object with position and dimensions to draw
             Returns: nothing
             See also:               Full-justified text with gdiplus-x 
             Full justified texts in your reports with gdiplus x
             Samples: fulljustified.scx  /  fulljustify.prg
             Code sample:
local lctext

text to
lctext noshow
this library
was intended to provide visual foxpro 9.0 developers with an object based library to wrap the 600+ functions included with the gdi+ api. the intent is to mimic the system.drawing namespace in the .net framework. all classes in the library are based on the classes included in the system.drawing namespace and other classes that are dependencies for classes in the system.drawing namespace. some additional additional functionality has been added to take advantage of features built in to vfp 9.0 endtext
do locfile("system.app")
with _screen.system.drawing

   local
logfx as xfcgraphics
   logfx = .graphics.fromhwnd(
_screen.hwnd)
   logfx.drawstringjustified(lctext, .
font.new(“tahoma”,12);
      , .brushes.red, .rectangle.new(0,0,250,400))

endwith


XfcBitmap class
ToClipboard Sends the current bitmap to the clipboard
            Parameters: none
            Returns: nothing
            See also:              Send images to the clipboard with gdiplus-x revisited
            Code sample:
do locfile("system.app")

with _screen
.system.drawing
   local
lobmp as xfcbitmap
   lobmp = .
bitmap.fromfile(getpict())
   lobmp.toclipboard()
endwith

FromClipboard Creates a gdi+ bitmap object from the clipboard data
            Parameters: none
            Returns: gdi+ bitmap object
            Code sample:
do locfile("system.app")
with _screen.system.drawing

   local
lobmp as xfcbitmap
  
lobmp = .bitmap.fromclipboard()
   lobmp.
save
("c:\fromclip.png", .imaging.imageformat.png)
endwith


FromVarbinary Creates an image object from the specified varbinary string. useful to start manipulating an image directly without having to convert the binaries from the image to a file.
            Parameters: tcbinary
            Returns: gdiplusx bitmap object

            Code sample:


do locfile("system.app")
with _screen.system.drawing

   local
lcbinary
  lcbinary =
filetostr(getpict())
   local
lobmp as xfcbitmap
   lobmp = .
bitmap.fromvarbinary(lcbinary)
   lobmp.
save
("c:\fromvarbinary.png", .imaging.imageformat.png) endwith



FromScreen
            Captures the specified window or object image to a new gdi+ bitmap object

            Parameters:
                thwnd, tix, tiy, tiwidth, tiheight, tlensurevisible                 toform [, tix, tiy, tiwidth, tiheight [, tlensurevisible]]                 tocontrol [, tlensurevisible]
            Returns: gdi+ bitmap object
            See also: capture screens with gdiplus-x
            Code sample:

 
do locfile
("system.app")
with _screen
.system.drawing
   local
lobmp as xfcbitmap
   lobmp = .
bitmap.fromscreen()
   lobmp.
save("c:\fromscreen.png", .imaging.imageformat.png)
endwith




GetMonoChrome Returns a monochrome gdi+ bitmap (1bpp) of this image object.
            The image must be saved in the bmp image format in order to keep the 1bpp format. because the resulting bitmap is in an indexed pixel format, gdi+ cannot create a xfcgraphics object in order to draw on it. this function is recommended to be used immediately before saving to a file, in order to obtain the minimum file size. for some specific tiff compression types, a monochrome image of 1bpp is required too, see more details in these articles:
            Parameters: none
            Returns: gdi+ bitmap object
            See also: convert images to monochrome with gdiplus x
                         using tiffs with the new gdi+ classes – update
                         tiffs and the latest release of gdiplusx
            Code sample:

do locfile("system.app")
with _screen
.system.drawing
   local
lobmp as xfcbitmap
   lobmp = .
bitmap.fromfile(getpict())
   local
lomonoch as xfcbitmap
   lomonoch = lobmp.getmonochrome() 
 
 lomonoch.save("c:\monoch.bmp", .imaging.imageformat.bmp) endwith

GetPictureVal Returns a string containing the pictureval of this image object, according to the imageformat passed. you can retrieve the binaries of the image with no disk access, in any image format supported by gdi+
            Parameters: imageformat object
                             encoderparameter object (optional)
            Returns: string
            See also: manipulate images with no disk access with gdiplusx
            Code sample:

do locfile("system.app") local lobmp as xfcbitmap * obtaining the pictureval directly
with _screen
.system.drawing    lobmp = .bitmap.fromfile(getpict())    thisform.image1.pictureval = lobmp.getpictureval (.imaging.imageformat.bmp) endwith

GetPicturevalFromHBitmap Returns a string containing the pictureval of this image object using the hbitmap gdi technique. the binaries retrieved are always in bmp format, what makes it a big string in most times. but, in most cases, this technique runs about 40% faster than using getpictureval() function shown above. the imagecanvas objects uses this function to obtain the binaries from the images drawn.
            Parameters: none
            Returns: string
            See also: manipulate images with no disk access with gdiplusx
do locfile("system.app") local lobmp as xfcbitmap * obtaining the pictureval directly
with _screen
.system.drawing
   lobmp = .
bitmap.fromfile(getpict())    thisform.image1.pictureval = lobmp.getpicturevalfromhbitmap() endwith

ApplyColorMatrix Applies the received color matrix to the current bitmap object.  This is very useful, and provides an easy and quick way to apply image transformations in just one step, without having to use the imageattributes class.
             Parameters:                         tocolormatrix

             Returns: null
             See also: special effects on images with gdiplusx- part1
                           special effects on images with gdiplusx – part2
                           draw logos in your images with gdiplusx - part 2
             Code sample:
do locfile("system.app") with _screen.system.drawing    local lobmp as xfcbitmap
   lobmp = .bitmap.fromfile(getpict())
    local loclrmatrix as xfccolormatrix
   loclrmatrix = .imaging.colormatrix.new(;
      0.33, 0.33, 0.33, 0, 0, ;
      0.33, 0.33, 0.33, 0, 0, ;
      0.33, 0.33, 0.33, 0, 0, ;
      0, 0, 0, 1, 0, ;
      0, 0, 0, 0, 1)
   lobmp.applycolormatrix(loclrmatrix)
   lobmp.save("c:\clrmatrix.png", .imaging.imageformat.png)
endwith

GetMask Returns a bitmap object with the mask from the current bitmap.  In fact this function returns a bitmap with all the transparent parts of the image. useful when you need to convert a png image that contains transparencies to be used in the bmp image format.
             Parameters: none
             Returns: gdi+ bitmap object

ToPrinter Sends the image object to the printer
             Parameters: tnstretch, tcprintername, tnorientation, tnalignment
                        tnstretch                         *   specifies how an image is sized to fit inside a control.                         *   0 - clip. the image is clipped to fit the page. (default)                         *   1 - isometric. the image resizes to fit the page while maintaining its original proportions.                         *   2 - stretch. the image resizes to fit the page, but does not maintain its original proportions.
                        tcprintername                         *   specifies the name of the printer, the same of getprinter()
                        tnorientation:                         *   0 - portrait                         *   1 - landscape
                        tnalignment                         *   specifies a numerical value representing the alignment of the image in the page.                         *   0 - vertically centered left.                         *   1 - vertically centered right.                         *   2 - centered. centers image vertically and horizontally.                         *   4 - top left. aligns image in top left corner of the page.                         *   5 - top right. aligns image in top right corner of the page.                         *   6 - top center. aligns image at the top and horizontally centered on the page.                         *   7 - bottom left. aligns image in the bottom left corner of the page.                         *   8 - bottom right. aligns image in bottom right corner of the page.                         *   9 - bottom center. aligns image at the bottom and vertically centered on the page.
            Returns: nothing
            Code sample:
do locfile("system.app") with _screen.system.drawing
   local
lobmp as xfcbitmap
   lobmp = .
bitmap.fromfile(getpict())
   lobmp.toprinter()
endwith


FloodFill 
Fills an area of the current bitmap surface with the passed color. It is used to fill an area with a single specific color, starting from the determined coordinates.
            Parameters: tnX, tnY, toxfcColor
            Returns: nothing
do locfile("System.app") local lobmp as xfcbitmap * obtaining the pictureval directly
with _screen
.system.drawing 
   loBmp = .
bitmap.fromfile(GETPICT())    loBmp.FloodFill(10,100, .Color.Red)   
endwith





XfcColorMatrix class
MatrixMultiply Returns a new color matrix object resulting of the multiplication of two color matrices. this is very useful when more than one color matrix is needed to be applied to an image. multiplying the color matrices before they are applied to the image will bring a huge gain of performance.
            Parameters: tocolormatrixone, ;                         tocolormatrixtwo
            Returns: a new color matrix containing the resultant matrix
            Code sample:
do locfile
("system.app") with _screen.system.drawing    local lobmp as xfcbitmap
   lobmp = .
bitmap.fromfile(getpict())    local loclrmatrix1 as xfccolormatrix && greyscale matrix
   loclrmatrix1 = .imaging.colormatrix.new(;
      0.33, 0.33, 0.33, 0, 0, ;
      0.33, 0.33, 0.33, 0, 0, ;
      0.33, 0.33, 0.33, 0, 0, ;
      0, 0, 0, 1, 0, ;
      0, 0, 0, 0, 1)
  local loclrmatrix2 as xfccolormatrix && half brightness matrix
  loclrmatrix2 = .imaging.colormatrix.new(;
      0.5, 0, 0, 0, 0, ;
      0, 0.5, 0, 0, 0, ;
      0, 0, 0.5, 0, 0, ;
      0, 0, 0, 1, 0, ;
      0, 0, 0, 0, 1)

   local lonewclrmatrix as xfccolormatrix
   lonewclrmatrix = loclrmatrix1.multiply(loclrmatrix1, loclrmatrix2)
   lobmp.applycolormatrix(lonewclrmatrix)
   lobmp.save("c:\multclrmatrix.png", .imaging.imageformat.png)
endwith


XfcSize class
toRectangle Returns a xfcrectangle object from the current xfcsizef object


XfcSizeF class
toRectangleF Returns a xfcrectanglef object from the current xfcsizef object

2008-05-21

FoxCharts 0.20 Alpha

here's a new release of foxcharts


https://www.codeplex.com/release/projectreleases.aspx?projectname=vfpx&releaseid=13477


 


prerequisites:
visual foxpro 9 and the gdiplusx library from vfpx 











 


as you can see, 2 new charts are now available:


- stacked area


- cylinder


 



  • the stackedarea chart can be defined using the "charttype" property, that must be set to the numeric 10

  • the cylinder chart is derived from the original bars chart. to have it, select charttype for the bar option, and then set the bartype property to numeric 1 (0 = bar default; 1 = cylinder)

 


apart from this, many other important modifications were applied:


the main difference is that now foxcharts' base class is a container, that contains the gdiplusx imagecanvas, and the legend objects, responsible for drawing all the text needed.

now we can customize any of those labels in lots of ways. every piece of text, legend in the chart now has the following properties:




alignment - 0 left; 1 right; 2 center
backcolor
backcoloralpha - this is cool, (0-255) determines the transparency of the background of the label
caption
fontbold
fontitalic
fontname
fontsize
fontstrikethru
fontunderline
forecolor
forecoloralpha - determines the transparency of the label



the legends are represented by the following objects:



title
subtitle
xaxis
xaxislegend2
yaxis
shapelegend
scalelegend
sidelegend


this way, every piece of text in the chart can be fully customized, not only the font, but the backcolor and the alpha (transparency). now you can also change the alignment of the text, for example, to set the title to right alignment, all you have to do is to:


thisform.foxcharts1.title.alignment = 1 && right


 


i still need to remind you that this is still a preview version, destined for people that are interested in helping testing this tool.



please continue sending your suggestions and feedback!
it is really very appreciated


https://www.codeplex.com/release/projectreleases.aspx?projectname=vfpx&releaseid=13477




contains the alpha version of the foxcharts project.

unzip the file and run the form chartssample to see how it works.

this version also distributes the two main files from gdiplusx - system.app and gdiplusx.vcx.
if you are already a gdiplusx user, you can use your own gdiplusx version.
just make sure to be using the latest gdiplusx version.

gdiplusx is also a vfpx project. for more information, please visit the gdiplusx page at vfpx.


more information and pictures about this project can be obtained at the vfpimaging weblog:

http://weblogs.foxite.com/vfpimaging/archive/2008/04/04/5919.aspx

http://weblogs.foxite.com/vfpimaging/archive/2008/04/24/6040.aspx


this new release contains lots of enhancements:

chart types
- bar charts
- multiple bars
- stacked bars

- pie
- doughnut

- lines
- area
- stacked area
- points and shapes


color variations:
- basic colors
- custom colors
- gradient colors
- random colors
- monochrome
- gradient or solid colors


legends in many places: axys, shapes, side legends

scales

customize:
- titles
- subtitles
- backgrounds (solid or gradient)
- fonts
- colors

2008-05-11

Crop Images with GdiPlusX

Cropping an image is super simple using GdiplusX

Prerequisites
Visual FoxPro 9 and the GdiplusX library from VFPX at GitHub 


Please make sure that you have the latest version!

The cropping is done by the fuction "Clone()" from the xfcBitmap class. All we need is to pass a xfcRectangle object containing the X, Y, Width and Height of the desired image to be cropped.

Original image



Top Left


Center


Bottom Right


Run the code below, selecting any image, and you will see the image cropped in three ways: the top-left part of the image, the bottom-right part, and the center.


LOCAL lcsource, lnwidth, lnheight
m.lcsource = GETPICT()
IF EMPTY(m.lcsource)
 RETURN
ENDIF

DO LOCFILE("system.app")

WITH _SCREEN.SYSTEM.drawing

 * load image to gdiplusx
 LOCAL lobmp AS xfcbitmap
 m.lobmp    = .BITMAP.fromfile(m.lcsource)
 m.lnwidth  = m.lobmp.WIDTH
 m.lnheight = m.lobmp.HEIGHT

 * crop image
 LOCAL locropped AS xfcbitmap

 * crop top-left
 LOCAL lorect AS xfcrectangle
 m.lorect = .rectangle.new(0, 0, m.lnwidth / 2, m.lnheight / 2)
 m.locropped = m.lobmp.CLONE(m.lorect)
 m.locropped.SAVE("d:\Tools\crop-topleft.png", .imaging.imageformat.png)
 RUN /N explorer.EXE d:\Tools\crop-topleft.png

 * crop bottom-right
 * now, the rectangle region will be created inside the clone function
 m.locropped = m.lobmp.CLONE(.rectangle.new(m.lnwidth / 2, m.lnheight / 2, m.lnwidth / 2, m.lnheight / 2))
 m.locropped.SAVE("d:\Tools\crop-bottomright.png", .imaging.imageformat.png)
 RUN /N explorer.EXE d:\Tools\crop-bottomright.png

 * crop center
 m.locropped = m.lobmp.CLONE(.rectangle.new(m.lnwidth / 4, m.lnheight / 4, m.lnwidth / 2, m.lnheight / 2))
 m.locropped.SAVE("d:\Tools\crop-center.png", .imaging.imageformat.png)
 RUN /N explorer.EXE d:\Tools\crop-CENTER.png

ENDWITH
RETURN