coding
c# Mandelbrot fractal unleashed!
by brian on May.15, 2008, under .NET, c#, coding, graphics
I remember the first time I saw the Mandelbrot set. It was incredible! After I had successfully programmed at it on my 8088 (a very old DOS computer). I would wait 10 minutes at a time for a screen to pop up. The detail was nothing short of amazing. The swirls, the shapes, the colors. The neatest thing was the ability to zoom into it to reveal more and more and more detail.
Well it’s been many years and computers have improved a great deal as have the tools to program them. So I wrote another Mandelbrot explorer.
What is the Mandelbrot set? Well…. In short it is Xn+1 = Xn2 + C iterated until the magnitude of Xn is greater than 4 or the maximum number of iterations is met then the number of iterations is used as the color of the pixel. Xn is a complex number, C is another complex number where the x coordinate of the pixel defines the real part and the y coordinate defines the imaginary part of the number. The magnitude is defined as X2 + Absolute Value of (Xi2). Then this process is repeated for each pixel. Holy smoke that is a mouthful!
Anyway take a peek at the code if you’d like and surely get the app and have fun exploring the Mandelbrot set.
To zoom in a spot just click on it. The number is the number of iterations. The more iterations the deeper the pattern goes (well until you run into percision problems).
Have fun!
A shift
by brian on May.09, 2008, under coding, life
The last couple of weeks have been a real shift for me. After finishing up a contract I have spend most of my time in a different lanuage, and entirely different programming environment. I’ve switched from Windows and c# to Linux and Ruby. From normal applications to web applications.
One of the things I like most about switches is all the new stuff I learn. Currently I’m working on building sweetcarloan.com this has been very educational. I’ve learned a great deal about SEO (search engine optimization) and though the concepts are fairly easy to understand it’s incredible time consuming and difficult. I have new respect for those that do it for a living.
It’s been fun to dive back into Ruby a language that has some similarities to c# but some huge differences. It’s got good support for lambda statements, reflection, extensions methods, inline funtion definitions (hmm had remember the names off hand.) However there are some huge differences in syntax and Ruby is completely dynamic in typing.
So that’s this week it’s been a total shift.
c# force uppercase lettering in a ComboBox
by brian on Apr.28, 2008, under .NET, GUI, c#, c# coding GUI, coding
I recently changed from a TextEdit control to a ComboBox and was somewhat annoyed that there wasn’t a property that forced the input characters to all be uppercase. So I dug around and came up with the following method using the KeyPress event.
private void productNumber_KeyPress(object sender, KeyPressEventArgs e)
{
char c = e.KeyChar;
// make it uppercase only
if (c >= 'a' && c <= 'z')
{
int digit = (int)c;
digit = digit - 'a' + 'A';
e.KeyChar = Convert.ToChar(digit);
}
}
When the event handler is called it gives you a chance to edit the hit character. Just by changing e.KeyChar you change the actual input character. This is a nifty trick to have under your belt.
c# getting rid of the jitter!
by brian on Apr.18, 2008, under .NET, GUI, c#, c# coding GUI, coding, graphics
I recently was getting greatly annoyed with some drawing code in my program. I was drawing a photo that I could zoom and move around. When I zoomed with the wheel though it would briefly draw the image in two positions. The first position after it was zoomed, and the second position after it was re-centered on the screen. Well this looked awful. Not exactly professional looking. So I tried a hundered different things. I tried setting a bool variable in the control to tell the paint function not to draw. No good. The drawing was done with asynchronous messages. Then I tried BeginInvoke. That didn’t work also. I tried SuspendLayout and ResumeLayout functions of the Control class: No good. Finally I just used the Visible property which kind of worked, well I didn’t get the double picture, but my background was light color and the foreground dark, so there was still a bad looking flicker. After a couple of hours I finally found the solution at: http://weblogs.asp.net/jdanforth/archive/2004/03/12/88458.aspx. I worked on the example a little and boiled it down to two functions: StopDrawing and StartDrawing.
The techinque basically turns of drawing and events to the object on the win32 level underneath .Net. This is very handy and it worked very very well. Here is the code.
using System.Runtime.InteropServices;
private const int WM_SETREDRAW = 0x000B;
private const int WM_USER = 0x400;
private const int EM_GETEVENTMASK = (WM_USER + 59);
private const int EM_SETEVENTMASK = (WM_USER + 69);
[DllImport("user32", CharSet = CharSet.Auto)]
private extern static IntPtr SendMessage(IntPtr hWnd, int msg, int wParam, IntPtr lParam);
IntPtr eventMask = IntPtr.Zero;
public void StopDrawing()
{
if (drawStopCount == 0)
{
// Stop redrawing:
SendMessage(this.Handle, WM_SETREDRAW, 0, IntPtr.Zero);
// Stop sending of events:
eventMask = SendMessage(this.Handle, EM_GETEVENTMASK, 0, IntPtr.Zero);
}
drawStopCount++;
}
public void StartDrawing()
{
drawStopCount--;
if (drawStopCount == 0)
{
// turn on events
SendMessage(this.Handle, EM_SETEVENTMASK, 0, eventMask);
// turn on redrawing
SendMessage(this.Handle, WM_SETREDRAW, 1, IntPtr.Zero);
Invalidate();
Refresh();
}
}
c# open an URL programatically
by brian on Apr.15, 2008, under .NET, c#, coding
Here is the easy way to open the browser from a c# .Net application.
string url="http://blog.bee-eee.com"; System.Diagnostics.Process.Start(url);
There you go. Pretty easy uh.
c# joining an array of strings.
by brian on Apr.14, 2008, under .NET, c#, coding
Here the easy way to get comma’s between each of the items in an array in a string.
string[] string_array=new string[]{"1","2","3","4"};
String.Join(",",string_array)
The output is:
1,2,3,4
c# Command Line Arguments
by brian on Apr.14, 2008, under .NET, Uncategorized, c#, coding
Here’s how you access the command line arguments:
string[] argv = Environment.GetCommandLineArgs();
c# writing out a Tiff File using libtiff
by brian on Mar.12, 2008, under GUI, c#, c# coding GUI, coding, graphics
Tiff files are interesting. They are like the all inclusive file format. It is an extremely flexible file format that allows for many types of pixel formats that other image formats couldn’t possibly handle. For instance 16 bits per channel or sample in the Tiff lingo. Event the possibility of 4 or 5 samples per pixel. If you wanted you could have a Red, Green, Blue, IR, Alpha channel. Although software would have a difficult time displaying the image. Anyway I digress — tiff being somewhat flexible is also some what difficult to manage, this is where libtiff comes in handy. It handles most of this for us.
The first step is to add using System.Runtime.InteropServices; to you module. Then add the stubs for the libtiff functions as follows:
static class TiffHandler
{
[DllImport("libtiff3.dll")]
private static extern int TIFFOpen(String image_path, String opts);
[DllImport("libtiff3.dll")]
private static extern void TIFFClose(int handle);
[DllImport("libtiff3.dll")]
private static extern void TIFFGetField(int handle, uint property, ref UInt32 value );
[DllImport("libtiff3.dll", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)]
private static extern int TIFFSetField(int handle, uint property, uint value);
[DllImport("libtiff3.dll", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)]
private static extern int TIFFSetField(int handle, uint property, string value);
[DllImport("libtiff3.dll")]
private unsafe static extern int TIFFReadRGBAImage(int handle, UInt32 width, UInt32 height, byte *raster, int Unkown);
[DllImport("libtiff3.dll")]
private unsafe static extern int TIFFReadEncodedStrip(int handle, int strip, byte* buf, int size);
[DllImport("libtiff3.dll")]
private unsafe static extern byte* _TIFFmalloc(UInt32 size);
[DllImport("libtiff3.dll")]
private unsafe static extern void _TIFFfree(byte* pointer);
[DllImport("libtiff3.dll")]
private unsafe static extern void TIFFWriteEncodedStrip(int handle, int offset, byte* buffer, int size);
[DllImport("libtiff3.dll")]
private static extern uint TIFFScanlineSize(int handle);
[DllImport("libtiff3.dll")]
private static extern int TIFFDefaultStripSize(int handle, int size);
[DllImport("libtiff3.dll")]
private unsafe static extern int TIFFWriteScanline(int handle, byte* buffer, int row, int sample);
[DllImport("libtiff3.dll")]
private unsafe static extern int TIFFReadScanline(int handle, byte* data, int row, int sample);
Next we add the constants. I’m not going to add them all there are thousands of them but here is an example of the ones that are used in writting a tiff. If you want more look in the libtiff header files. It seems like it’s in tiff.h
const uint TIFFTAG_IMAGEWIDTH = 256; /* image width in pixels */
const uint TIFFTAG_IMAGELENGTH = 257; /* image height in pixels */
const uint TIFFTAG_BITSPERSAMPLE = 258; /* bits per channel (sample) */
const uint TIFFTAG_SAMPLESPERPIXEL = 277; /* samples per pixel */
const uint TIFFTAG_COMPRESSION = 259; /* data compression technique */
const uint COMPRESSION_DEFLATE = 32946; /* Deflate compression */
const uint PHOTOMETRIC_RGB = 2; /* RGB color model */
const uint TIFFTAG_PLANARCONFIG = 284; /* storage organization */
const uint PLANARCONFIG_CONTIG = 1; /* single image plane */
And then the code to write out the image to a file:
public static unsafe void SaveTiff(string fileName, ImageArray array)
{
int tif = TIFFOpen(fileName, "w");
int Samples = 3;
TIFFSetField(tif, TIFFTAG_IMAGEWIDTH, (uint)array.Width);
TIFFSetField(tif, TIFFTAG_IMAGELENGTH, (uint)array.Height);
TIFFSetField(tif, TIFFTAG_COMPRESSION, COMPRESSION_DEFLATE);
TIFFSetField(tif, TIFFTAG_PLANARCONFIG, PLANARCONFIG_CONTIG);
TIFFSetField(tif, TIFFTAG_PHOTOMETRIC, PHOTOMETRIC_RGB);
TIFFSetField(tif, TIFFTAG_BITSPERSAMPLE, 16);
TIFFSetField(tif, TIFFTAG_SAMPLESPERPIXEL, (uint)Samples);
TIFFSetField(tif, TIFFTAG_ARTIST, "Bee Eee Inventions, LLC");
int cnt = array.Width * array.Height;
int size = (cnt * Samples * sizeof(ushort));
ushort* buffer;
buffer = (ushort*)_TIFFmalloc((uint)size);
// We set the strip size of the file to be size of one row of pixels
//int RowSize = TIFFDefaultStripSize(tif, array.Width*3);
// copy data into buffer
int i,pos,ptr=0;
for (i = 0, pos = 0; i < cnt; i++, pos += Samples, ptr++)
{
buffer[pos] = (ushort)(array.Data[ptr].r);
buffer[pos + 1] = (ushort)(array.Data[ptr].g);
buffer[pos + 2] = (ushort)(array.Data[ptr].b);
}
// Write the information to the file
TIFFWriteEncodedStrip(tif, 0, (byte *)buffer, size);
TIFFClose(tif);
_TIFFfree((byte *)buffer);
}
Enjoy. Next article I’ll show you how to read some tiff files. Opening all tiff files could be difficult. :)
C# Determining if a column exists in an SQL database using ADO.Net
by brian on Feb.15, 2008, under c#, coding
This information was very difficult to come by. There isn’t any useful documentation or tutorials that I found. I have to admit that what follows may only be valid for the System.Data.SQLite.SQLiteConnection sql connection. Just as a warning it may or may not work with a different database connection.
The idea is that you’ve changed your database layout and you want test the opened database to make sure the changes are valid. If they aren’t then you want to alter the table. Anyway here is the code
DataTable columns = connection.GetSchema("columns");
System.Data.DataRow[] selColumns = columns.Select("COLUMN_NAME='PREVIEW' AND TABLE_NAME='IMAGES'");
if (selColumns.Length == 0)
{
ExecuteNonQuerySql("ALTER TABLE IMAGES ADD COLUMN PREVIEW BLOB");
}
The following line gets the schema table that holds all of the columns from every table.
DataTable columns = connection.GetSchema("columns");
The following line filters through all of the columns and get’s just the column with name ‘PREVIEW’ and belongs to the table ‘IMAGES’.
System.Data.DataRow[] selColumns = columns.Select("COLUMN_NAME='PREVIEW' AND TABLE_NAME='IMAGES'");
If there are any columns that fit the filter than the length of selColumns will be greater than zero. If it doesn’t exist than selColumns.Length will be 0 and you know that the column doesn’t exist.
c# Adjusting brightness,contrast, and gamma of an image.
by brian on Jan.23, 2008, under .NET, GUI, c#, c# coding GUI, coding, graphics
c# and gdi+ have a simple way to control the colors that are drawn. It’s basically a ColorMatrix. It’s a 5×5 matrix that is applied to each color if it is set.
Adjusting brightness is just preforming a translate on the color data, and contrast is preforming a scale on the color. Gamma is a whole different form of transform, but it’s included in ImageAttributes which accepts the ColorMatrix.
So here’s the simple code:
Bitmap origanalImage;
Bitmap adjustedImage;
double brightness = 1.0f; // no change in brightness
double constrast = 2.0f; // twice the contrast
double gamma = 1.0f; // no change in gamma
float adjustedBrightness = brightness - 1.0f;
// create matrix that will brighten and contrast the image
float[][] ptsArray ={
new float[] {contrast, 0, 0, 0, 0}, // scale red
new float[] {0, contrast, 0, 0, 0}, // scale green
new float[] {0, 0, contrast, 0, 0}, // scale blue
new float[] {0, 0, 0, 1.0f, 0}, // don't scale alpha
new float[] {adjustedBrightness, adjustedBrightness, adjustedBrightness, 0, 1}};
imageAttributes = new ImageAttributes();
imageAttributes.ClearColorMatrix();
imageAttributes.SetColorMatrix(new ColorMatrix(ptsArray), ColorMatrixFlag.Default, ColorAdjustType.Bitmap);
imageAttributes.SetGamma(gamma, ColorAdjustType.Bitmap);
Graphics g = Graphics.FromImage(adjustedImage);
g.DrawImage(originalImage, new Rectangle(0,0,adjustedImage.Width,adjustedImage.Height)
,0,0,bitImage.Width,bitImage.Height,
GraphicsUnit.Pixel, imageAttributes);
So there it is. Simple enough isn’t it.
