Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 70 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
70
Dung lượng
4,08 MB
Nội dung
[ Team LiB ] 7.8 Drawing Transparent Graphics Objects Sometimes we need to draw objects on top of images—and these objects may need to be transparent. As we discussed earlier, color in GDI+ has four components: alpha, red, green, and blue. The value of each component varies from 0 to 255. The alpha component represents the transparency in GDI+ color. Zero represents a fully transparent color; 255, a fully opaque color. An application must create transparent pens and brushes to draw transparent graphics objects. An application can use the Color.FromArgb method to specify the ratio of all four components in a color. For example, the following code snippet creates a fully opaque green pen and brush. Pen solidPen = new Pen(Color.FromArgb(255, 0, 255, 0), 10); SolidBrush solidColorBrush = new SolidBrush(Color.FromArgb(255, 0, 255, 0)); The following code snippet creates semitransparent colors and brushes. Pen transPen = new Pen(Color.FromArgb(128, 0, 255, 0), 10); SolidBrush semiTransBrush = new SolidBrush(Color.FromArgb(60, 0, 255, 0)); Listing 7.24 views an image and draws lines and a rectangle with different transparencies. Listing 7.24 Drawing transparent graphics objects private void Form1_Paint(object sender, System.Windows.Forms.PaintEventArgs e) { Graphics g = e.Graphics; // Create an image from a file Image curImage = Image.FromFile("myphoto.jpg"); // Draw image g.DrawImage(curImage, 0, 0, curImage.Width, curImage.Height); // Create pens with different opacity Pen opqPen = new Pen(Color.FromArgb(255, 0, 255, 0), 10); Pen transPen = new Pen(Color.FromArgb(128, 0, 255, 0), 10); Pen totTransPen = new Pen(Color.FromArgb(40, 0, 255, 0), 10); // Draw Graphics object using transparent pens g.DrawLine(opqPen, 10, 10, 200, 10); g.DrawLine(transPen, 10, 30, 200, 30); This document was created by an unregistered ChmMagic, please go to http://www.bisenter.com to register it. Thanks. g.DrawLine(totTransPen, 10, 50, 200, 50); SolidBrush semiTransBrush = new SolidBrush(Color.FromArgb(60, 0, 255, 0)); g.FillRectangle(semiTransBrush, 20, 100, 200, 100); } Figure 7.39 shows the output from Listing 7.24. Figure 7.39. Drawing transparent graphics objects [ Team LiB ] This document was created by an unregistered ChmMagic, please go to http://www.bisenter.com to register it. Thanks. [ Team LiB ] 7.9 Viewing Multiple Images Sometimes we need to draw multiple images on the same spot, one on top of the other. In the previous section we discussed how to draw transparent graphics objects on top of images. In this section we will discuss how to draw images (transparent or opaque) on top of other images. Drawing transparent images is different from drawing transparent graphics objects such as lines, rectangles, or ellipses. To draw transparent graphics objects, we simply create a transparent color and use this color when we create a pen or a brush. Drawing transparent images is controlled by the color matrix (represented by the ColorMatrix class), which defines the transparency of the image. Acolor matrix is applied to an image when we call DrawImage. The DrawImage method takes an argument of type ImageAttributes. The SetColorMatrix method of ImageAttributes sets a color matrix to the ImageAttributes type. Passing ImageAttributes to DrawImage applies the color matrix to the image. Chapter 8 discusses this process in more detail. As usual, we create a Windows application. In this application we will draw a large image, and a small image on top of the large image. To make this application more interesting, we add a transparency control to the application so that we can adjust the transparency of the top image. The final form looks like Figure 7.40. Figure 7.40. Drawing multiple images This document was created by an unregistered ChmMagic, please go to http://www.bisenter.com to register it. Thanks. Now let's add a TrackBar control to the form. We set the Maximum and Minimum properties of TrackBar to 10 and 0, respectively. Then we write a TrackBar control scroll event so that when we scroll the track bar, it can manage the transparency of the image. Note We have defined a float type variable in the class as follows: float tpVal = 1.0f; Now we convert the TrackBar value to a floating value so that we can use it in the ColorMatrix class to set the color of the image, as Listing 7.25 shows. The ColorMatrix class constructor takes an array, which contains the values of matrix items. The Item property of this class represents a cell of the matrix and can be used to get and set cell values. Besides the Item property, the ColorMatrix class provides 25 MatrixXY properties, which represent items of the matrix at row (x + 1) and column (y + 1). MatrixXY properties can be used to get and set an item's value. See Chapter 10 (Section 10.7.1) for more details. Listing 7.25 The TrackBar scroll event handler private void trackBar1_Scroll(object sender, System.EventArgs e) { tpVal = (float)trackBar1.Value/10; this.Invalidate(); } We will now view both images on the form's paint event, as Listing 7.26 shows. We create an Image object and view the first image. Then we create a ColorMatrix object with transparency and set it with the ImageAttribute property. Later we attach the ImageAttribute property to the second image when we draw it using the DrawImage method. Listing 7.26 Viewing multiple images on the form-load event private void Form1_Paint(object sender, System.Windows.Forms.PaintEventArgs e) { // Create an Image object (first image) from a file curImage = Image.FromFile("roses.jpg"); // Draw first image e.Graphics.DrawImage(curImage, AutoScrollPosition.X, AutoScrollPosition.Y, curImage.Width, curImage.Height ); // Create an array of ColorMatrix points float[][] ptsArray = { new float[] {1, 0, 0, 0, 0}, new float[] {0, 1, 0, 0, 0}, new float[] {0, 0, 1, 0, 0}, new float[] {0, 0, 0, tpVal, 0}, new float[] {0, 0, 0, 0, 1} This document was created by an unregistered ChmMagic, please go to http://www.bisenter.com to register it. Thanks. }; // Create a ColorMatrix object ColorMatrix clrMatrix = new ColorMatrix(ptsArray); // Create image attributes ImageAttributes imgAttributes = new ImageAttributes(); // Set color matrix imgAttributes.SetColorMatrix(clrMatrix, ColorMatrixFlag.Default, ColorAdjustType.Bitmap); // Create second Image object from a file Image smallImage = Image.FromFile("smallRoses.gif"); // Draw second image with image attributes e.Graphics.DrawImage(smallImage, new Rectangle(100, 100, 100, 100), 0, 0, smallImage.Width, smallImage.Height, GraphicsUnit.Pixel, imgAttributes ); } [ Team LiB ] This document was created by an unregistered ChmMagic, please go to http://www.bisenter.com to register it. Thanks. [ Team LiB ] 7.10 Using a Picture Box to View Images So far in our sample applications, we have used a form as the drawing surface for images. You can also use a PictureBox control to view images. Picture boxes are easy to use, and this control optimizes the rendering process with a built-in double buffering feature. A picture box is recommended for viewing (but not manipulating) images when you know the exact size of the image. The PictureBox class is defined in the System.Windows.Forms namespace. The Image property, which takes an Image object, sets the image to the picture box that you want to display. You can also set the position and clipping, using the SizeMode property. SizeMode, which is of type PictureBoxSizeMode enumeration, specifies how an image is positioned within a picture box. The members of the PictureBoxSizeMode enumeration are defined in Table 7.6. To view an image in a PictureBox control, we simply create an Image object using any of the Image class methods and set the PictureBox.Image property to that image. Listing 7.27 views an image in a picture box. To test this code, create a Windows application, add a PictureBox control to the form by dragging it from the toolbox, and add code to the form-load event handler. Listing 7.27 Viewing an image in a picture box Image curImage = Image.FromFile("roses.jpg"); pictureBox1.Image = curImage; pictureBox1.SizeMode = PictureBoxSizeMode.StretchImage; Figure 7.41 shows the output from Listing 7.27. Figure 7.41. Viewing an image in a picture box This document was created by an unregistered ChmMagic, please go to http://www.bisenter.com to register it. Thanks. Table 7.6. PictureBoxSizeMode members MemberDescription AutoSize The picture box is automatically set to the same size as the image. CenterImage The image is displayed in the center of the picture box. Normal The image is placed in the upper left corner of the picture box and clipped if it is larger than the control. StretchImage The image is stretched or shrunk to fit the size of the picture box. [ Team LiB ] This document was created by an unregistered ChmMagic, please go to http://www.bisenter.com to register it. Thanks. [ Team LiB ] This document was created by an unregistered ChmMagic, please go to http://www.bisenter.com to register it. Thanks. 7.11 Saving Images with Different Sizes Sometimes we need to save an image with a different size than it originally had. As we discussed earlier, the Save method of the Image class is used to save images. This method also allows us to specify the size of a saved image. To make our program even more interesting, we will determine the size of the saved image at runtime. Create a Windows application and add two text boxes, two tables, and a button control to the form. The text boxes are used to specify the height and width of the saved image, and the button is used to save the image with the new size, as shown in Figure 7.42. Figure 7.42. Saving images with different sizes First we specify an Image private variable: private Image curImage; Then we create and view the image at the form's paint event handler, as shown in Listing 7.28. Listing 7.28 Viewing an image This document was created by an unregistered ChmMagic, please go to http://www.bisenter.com to register it. Thanks. private void Form1_Paint(object sender, System.Windows.Forms.PaintEventArgs e) { curImage = Image.FromFile("roses.jpg"); e.Graphics.DrawImage(curImage, AutoScrollPosition.X, AutoScrollPosition.Y, curImage.Width, curImage.Height ); } On the Save Image button click, we ask the user to specify a file name and we call the Save method of the Image class, which saves an image in the given format. As Listing 7.29 shows, we also read the size of the new image from textBox1 and textBox2 and specify the size when we create a new Bitmap object from the existing image. Listing 7.29 Saving an image with the given size private void SaveImageBtn_Click(object sender, System.EventArgs e) { if(curImage == null) return; int height = Convert.ToInt16(textBox1.Text); int width = Convert.ToInt16(textBox2.Text); SaveFileDialog saveDlg = new SaveFileDialog(); saveDlg.Title = "Save Image As"; saveDlg.OverwritePrompt = true; saveDlg.CheckPathExists = true; saveDlg.Filter = "Bitmap File(*.bmp)|*.bmp|Gif File(*.gif)|*.gif| " + "JPEG File(*.jpg)|*.jpg"; saveDlg.ShowHelp = true; if(saveDlg.ShowDialog() == DialogResult.OK) { string fileName = saveDlg.FileName; string extn = fileName.Substring(fileName.Length - 3, 3); Bitmap newImage = new Bitmap(curImage, new Size(width, height)); if(extn.Equals("bmp")) newImage.Save(fileName,ImageFormat.Bmp); else if(extn.Equals("gif")) newImage.Save(fileName,ImageFormat.Gif); else if(extn.Equals("jpg")) newImage.Save(fileName,ImageFormat.Jpeg); } } Now we save an image with a width of 200 and a height of 200. The results are shown in Figure 7.43. Figure 7.43. New image, with width of 200 and height of 200 This document was created by an unregistered ChmMagic, please go to http://www.bisenter.com to register it. Thanks. [...]... ImageAttributes(); // Create three ColorMap objects ColorMap colorMap1 = new ColorMap(); ColorMap colorMap2 = new ColorMap(); ColorMap colorMap3 = new ColorMap(); // Set the ColorMap objects' properties colorMap1.OldColor = Color.Red; colorMap1.NewColor = Color.Green; colorMap2.OldColor = Color.Yellow; colorMap2.NewColor = Color.Navy; colorMap3.OldColor = Color.Blue; colorMap3.NewColor = Color.Aqua; // Create an... records describing the respective objects to the metafile Finally, we release the objects Listing 8.5 Creating a metafile private void CreateMetaFile_Click(object sender, System.EventArgs e) { Metafile curMetafile = null; // Create a Graphics object Graphics g = this.CreateGraphics(); // Get HDC IntPtr hdc = g.GetHdc(); // Create a rectangle Rectangle rect = new Rectangle(0, 0, 200, 200); // Use HDC... the grayscale value, and callsSetPixel to apply the new color In the following code snippet we read the color of a pixel; calculate the grayscale value by applying a formula to the red, green, and blue components; and call SetPixel to set the pixel's new grayscale color Color curColor = curBitmap.GetPixel(i, j); int ret = (curColor.R + curColor.G + curColor.B) / 3; curBitmap.SetPixel(i, j, Color.FromArgb(ret,... a record This method has many overloaded forms Graphics.EnumerateMetafileProc takes five parameters and is defined as follows: public delegate bool Graphics.EnumerateMetafileProc( EmfPlusRecordType recordType, int flags, int dataSize, IntPtr data, PlayRecordCallback callbackData ); GDI/ GDI+ Record Each metafile record describes a command that is capable of drawing, filling, or changing the graphics... metafile records private void EnumerateMetaFile_Click(object sender, System.EventArgs e) { // Create a Graphics object Graphics g = this.CreateGraphics(); g.Clear(this.BackColor); // Create a Metafile object from a file Metafile curMetafile = new Metafile("mtfile.wmf"); // Set EnumerateMetafileProc property Graphics.EnumerateMetafileProc enumMetaCB = new Graphics.EnumerateMetafileProc(EnumMetaCB); //... Graphics class Tip Using the same approach, you can easily create a metafile editor similar to GDI+ Painter, in which you can draw graphics objects and save them as metafiles You can even change the GDI+ Painter application code to do so 8.2.3 Enhanced Metafiles This document was created by an unregistered ChmMagic, please go to http://www.bisenter.com to register it Thanks Using enhanced metafiles, you can... surface For example, clearing a graphics object, drawing a rectangle, filling an ellipse, creating a graphics container, and ending a graphics container are all examples of records After creating a metafile programmatically, if you call DrawRectangle, one record will be added to the metafile When you play back the metafile, GDI+ reads the record (DrawRectangle) and draws a rectangle The EmfPlusRecordType... the MSDN documentation: The enhanced Windows metafile (EMF) format contains a comment mechanism for embedding data within the metafile This comment mechanism is used to embed GDI+ records within an EMF file Applications that cannot read or recognize the comment data skip the comment records and render the records they do understand If the EMF+ file is played back by GDI+ , then the GDI+ records are used... Listing 8.8 Applying the color remap table private void ColorMap_Click(object sender, System.EventArgs e) { // Create a Graphics object Graphics g = this.CreateGraphics(); This document was created by an unregistered ChmMagic, please go to http://www.bisenter.com to register it Thanks g.Clear(this.BackColor); // Create an Image object Image image = new Bitmap("Sample.bmp"); // Create ImageAttributes... 0, curBitmap.Width, curBitmap.Height); This document was created by an unregistered ChmMagic, please go to http://www.bisenter.com to register it Thanks // Set each pixel to grayscale using GetPixel // and SetPixel for (int i = 0; i < curBitmap.Width; i++) { for (int j = 0; j < curBitmap.Height; j++) { Color curColor = curBitmap.GetPixel(i, j); int ret = (curColor.R + curColor.G + curColor.B) / 3; curBitmap.SetPixel(i, . and blue components; and call SetPixel to set the pixel's new grayscale color. Color curColor = curBitmap.GetPixel(i, j); int ret = (curColor.R + curColor.G + curColor.B) / 3; curBitmap.SetPixel(i,. color scale of a bitmap // Create a Graphics object from a button // or menu click event handler Graphics g = this.CreateGraphics(); g.Clear(this.BackColor); // Create a Bitmap object Bitmap curBitmap. functionality in our applications. The topics will include Understanding LockBits and UnlockBits Working with metafiles and metafile enhancements Working with the color matrix, color map, and color