This article has been
excerpted from book "Graphics Programming with GDI+".
A bitmap stores data for an image and its attributes in pixel format. The Bitmap
class, which is inherited from the Image class, encapsulates a graphic bitmap in
GDI+. Because the Bitmap class in inherited from the Image class, it offers all
the methods and properties that we discussed in the previous section. The Bitmap
class defines additional functionality. In this section we will learn about the
members of the Bitmap class and how to use them.
Creating a Bitmap Object
The Bitmap class provides about a dozen overload forms of the constructors. You
can create a Bitmap object from a bitmap file, or from Image, Stream, string, or
Type objects. When you create a Bitmap object, you can also specify the size of
the bitmap, the resolution of the Graphics object, and the pixel format of the
bitmap.
The code snippet in Listing 7.17 creates Bitmap objects from an Image and file
name with or without the size of the Bitmap included.
Listing 7.17: Creating Bitmap object from different sources
//Creating an Image object
Image curImage =
Image.FromFile("myfile.gif");
//Creating a Bitmap object from a file
name
Bitmap curBitmap1 =
new Bitmap("myfle.gif");
//Creating a Bitmap object from an Image
object
Bitmap curBitmap2 =
new Bitmap(curImage);
//Creating a Bitmap object with size and
image
Bitmap curBitmap3 =
new Bitmap(curImage,
new Size(200,
100));
//Creating a Bitmap object with no images
Bitmap curBitmap4 =
new Bitmap(200,
100);
Beside the constructor, the Bitmap class provides two static methods FromHicon
and FromResource which can be used to create a Bitmap object from a window
handle to an icon and from a Windows resource (.res file), respectively.
Viewing a Bitmap
Viewing a bitmap using the Bitmap class is similar to viewing an image. After
constructing a Bitmap object, you just pass it as a parameter to DrawImage. The
following code snippet creates a Bitmap object from a file and views the bitmap
by calling the DrawImage method of a Graphics object associated with a form. You
can write this code on a menu or a button click event handler.
Graphics g =
this.CreateGraphics();
Bitmap bitmap =
new Bitmap("myfile.jpg");
g.DrawImage(bitmap, 20, 20);
g.Dispose();
The Bitmap Class Methods and Properties
The Bitmap class doesn't define any properties beyond those defined in the Image
class. However, Bitmap does provide additional methods. Among them are FromHicon,
FromResource, GetHbitmap, GetHicon, GetPixel, LockBits, MakeTransparent,
SetPixel, SetResolution, and UnlockBits.
The FromHicon and FromResource methods create a Bitmap object from a window
handle to an icon and from a Windows resource, respectively.
The GetHbitmap and GetHicon methods create a Windows HBITMAP structure and a
window handle to an icon.
The GetPixel and SetPixel methods get and set the color of the specified pixel
of an image. There methods are useful when an application needs to blur images,
change the color of specific pixels, change the contrast of pixels, and so on.
You can blur an image by reducing the color depth of pixels. We will use
GetPixel and SetPixel in examples in this article and the next.
The following line of code returns the color of a pixel at positions x=10 and
y=10:
Color curColor =
curBitmap.GetPixel(10, 10);
The following code snipped uses SetPixel to change all pixels between point
(50,50) and point (60,60) to red:
for (int i = 50;
i < 60; i++)
{
for (int
j = 50; j < 60; j++)
{
curBitmap.SetPixel(i, j, Color.Red);
}
}
SetResolution sets the resolution of a bitmap. This method takes two parameters
of type float, which represent the horizontal resolution and vertical resolution
in dots per inch.
MakeTransparent makes the default color transparent to a bitmap. This method
takes either no arguments or a single argument of type Color:
Color curColor =
CurBitmap.GetPixel(10, 10);
curBitmap.MakeTransparent();
or
curBitmap.MakeTransparent(curColor);
To test the methods and properties of Bitmap, we create a Windows application
and add Open File and Exit menu items as in the previous examples. Then we add
controls for a group box, text boxes, a button, a check box, and some labels.
The final form looks like Figure 7.33. We can set the resolution and
transparency of the bitmap from here.
We add the following application-level variable to the application.
//Varaible
private
Bitmap curBitmap;
private float
imgHeight;
private float
imgWidth;
private string
curFileName;
As usual, we browse images on the Open File menu item click event handler and
close the form on the Exit menu item click event handler. We also create a
Bitmap object from the selected file and store the height and width of the
image, as Listing 7.18 shows.
FIGURE 7.33: A bitmap example
LISTING 7.18: The Open File and Exit menu item event handlers
private void
OpenBmpMenu_Click(object sender, System.EventArgs
e)
{
OpenFileDialog openDlg =
new OpenFileDialog();
openDlg.Filter = "All Bitmap files
|*.bmp; *.gif; *.Jpg;";
string filter = openDlg.Filter;
openDlg.Title = "Open Bitmap File";
OpenDlg.ShowHelp = true;
if (openDlg.showDialog() ==
DialogResult.OK)
{
curFileName = openDlg.FileName;
curBitmap = new
Bitmap(curFileName);
imgHeight = curBitmap.Height;
imgWidth = curBitmap.Width;
}
Invalidate();
}
private void
ExitMenu_Click(object sender, System.EventArgs
e)
{
this.Close();
}
Now we write code on the paint event handler to view the bitmap (see Listing
7.19).
LISTING 7.19: The paint event handler
private void
Form1_Paint(object sender, System.Windows.Forms.PaintEventArgs
e)
{
Graphics g = e.Graphics;
if (curBitmap !=
null)
{
g.DrawImage(curBitmap, AutoScrollPosition.X,
AutoScrollPosition.Y, imgWidth, imgHeight);
}
}
The code for the Apply Settings button click event handler is given in Listing
7.20. It reads values for horizontal and vertical resolution from two text boxes
and sets values for a bitmap using the SetResolution method. It also uses the
MakeTransparent and SetPixel methods.
LISTING 7.20: the Apply Settings button click event handler
private void
ApplyBtn_Click(object sender, System.EventArgs
e)
{
if (curBitmap ==
null)
return;
float hDpi = 90;
float vDpi = 90;
//Create dpi settings
if (textBox1.Text.ToString()
!= " ")
hDpi = Convert.ToInt32(textBox1.Text);
if (textBox1.Text.ToString() !=
" ")
vDpi = Convert.ToInt32(textBox1.Text);
curBitmap.SetResolution(hDpi, vDpi);
//If Transparent check box is checked
if (checkBox1.checked)
{
Color curColor =
curBitmap.GetPixel(10, 10);
curBitmap.MakeTransparent();
}
//set pixel colors to red
for (int
i = 50; i < 60; i++)
{
for (int
j = 50; j < 60; j++)
{
curBitmap.SetPixel(i, j, Color.Red);
}
}
//Redraw
Invalidate();
}
If we run the application and click the Apply Settings button (see Figure 7.34),
a small red rectangle appears, showing that the color of that part of the image
has been changed to red.
The LockBits and UnlockBits methods are used to lock and unlock a bitmap into
system memory. LockBits takes three parameters of type Rectangle, ImageLockMode
enumeration and PixelFormat enumeration and return an object of type BitmapData.
The rectangle is the portion of the bitmap that will be locked in system memory.
ImageLockMode provides the access level on the data. Its members include
Readonly, ReadWrite, UserInputBuffer, and WriteOnly. The PixelFormat enumeration
defines the format of color data for each pixel.
FIGURE 7.34: Changing the pixel colors of a bitmap
Conclusion
Hope the article would have helped you in understanding working with Bitmaps in
GDI+. Read other articles on GDI+ on the website.
|
This book teaches
.NET developers how to work with GDI+ as they develop applications
that include graphics, or that interact with monitors or printers.
It begins by explaining the difference between GDI and GDI+, and
covering the basic concepts of graphics programming in Windows. |