¡@
|
![]() |
2018¦~12¤ë02¤é |
![]() ¡@ |
²Ä¤G¤Q¤@³¹VB .NETø¹Ïª«¥ó¤Î¤èªk¤¶²Ð 21.5 ¼v¹³³B²z
¼v¹³³B²z(Image processing)ªº¼v¹³(Image)¡A¬O¤@Ó¤ñ¸û©â¶HªºÃþ§O¡A¦]¨äÄÝ©â¶HÃþ§O¥²¶·ÂǥѨäl¥ÍÃþ§O¦pÂI°}¹Ï(Bitmap)©Î¦V¶q¹Ï(MetaFile)¨Ó¹ê§@¡CÂI°}¹Ï(Bitmap)¬O¤@Ó¤Gºûªº¯x§Î¦ì¤¸(Byte¡A1 byte=8 bits)°}¦C¡A¥¦»P¹Ï¹³ªº¤¸¯À(Pixel²ºÙ¹Ï¯À¡A¬°^¤åPix»PElementªº²Õ¦X)¤@¤@¹ïÀ³¡C·í¯u¹êªºª«¥ó³Q±½´y¦¨ÂI°}¹Ï¹Ï¹³ÀÉ®×¥H«á¡A¹Ï¹³³Q¤À³Î¦¨³\¦hÁa¾îªººô®æ¡A¥H¨CÓºô®æÂI§@¬°¨ú¼Ë³æ¦ì¡C¦bÂI°}¹Ï¤¤ªº¨CӹϯÀÈ¥Nªí¤@Ó³æ¦ìºô®æ¤º¹Ï¹³ÃC¦âªº¥§¡È¡C³æ¦âÂI°}¹Ï¨CӹϯÀ¥u»Ýn¤@Ӧ줸(0»P1¡A¤À§O¥Nªí¶Â¦â¤Î¥Õ¦â)¡A¦Ç¦â©Î±m¦âÂI°}¹Ï¤¤¨CӹϯÀ»Ýn¦hӦ줸²Õ¼Æ¡C¦pªG¨CÓ¹³¯À³£¬O¥Ñ4Ӧ줸ºc¦¨¡A«h¨C¤@Ó¹³¯À¥i¥H¬O 16(2^4 = 16)Ó¤£¦Pªº¦â±m¤§¤@¡A¦pªG¬O8Ӧ줸«h¨C¤@Ó¹³¯À¥i¥H¬O 256(2^8 = 256)Ó¤£¦Pªº¦â±m¤§¤@¡C Windowsµ{¦¡¤ºÀx¦s¹Ï¹³¸ê°Tªº¤èªk¥Dn¦³(a)ÂI°}¹Ï(bitmap)¡A¤Î(b)¦V¶q¹Ï(Metafile)¨âºØ¡C¦V¶q¹ÏÀx¦sªº´N¬O²£¥Í¹Ï¹³ªº´yz¤Îø¹Ï«ü¥O¡A¤£¬O±N¹Ï¹³¥H¼Æ¦ì¤Æªº¹Ï¥Ü¥Nªí¡A¨ä¸û¾A¦X¥Î¨Ó´yz¥Ñ¤H¤uø»s¡A©Î¾÷¾¹²£¥Íªº¹Ï¹³¡A¤ñ¦p«Ø¿v³]pÂŹϡB¾÷±ñºc³y¹Ïµ¥¡CÂI°}¹Ï¸g±`¥Î¨Óªí¥Ü¨Ó¦Û¯u¹ê¥@¬Éªº½ÆÂø¹Ï¹³¡A¨Ò¦p¼Æ¦ì¤Æªº·Ó¤ù©Î¬Oµø°T¹Ï¹³¡CÂI°}¹Ï©M¦V¶q¹Ï³£¯àÀx¦s¦b¹q¸£°O¾ÐÅé©ÎºÏºÐ¾÷¤¤¡A¨Ã¥B³£¯à³q¹L°Å¶Kï¦bWindowsÀ³¥Îµ{¦¡¶¡¶Ç¿é¡C ÂI°}¹Ï©M¦V¶q¹Ïªº¥Dn°Ï§O¦b©ó¦ì¤¸¬M®g¹Ï¹³©M¦V¶q¹Ï¹³¤§¶¡ªº®t§O¡C¦ì¤¸¬M®g¼v¹³ÂÇÂ÷´²ªº¹Ï¯À¨Ó³B²z¿é¥X³]³Æ¡F¦Ó¦V¶q¹Ï¹³«h¨Ï¥Î²Ã¥dº¸®y¼Ð¨t²Î¨Ó³B²z¿é¥X³]³Æ¡A¨ä½u±ø©M¶ñ¥Rª«¥ó¯à³QÓ§O³B²z¡C²{¦b¤j¦h¼Æªº¼v¹³¿é¥X³]³Æ¬O¦ì¤¸¬M®g³]³Æ¡A³o¥]¬Aµø°TÅã¥Ü¡BÂI°}¹Ï¦Lªí¾÷¡B¹p®g¦Lªí¾÷©M¼Q¾¥¦Lªí¾÷¡C¦Óµ§¦¡Ã¸¹Ï¾÷«h¬O¦V¶q¹Ï¹³¿é¥X³]³Æ¡C ·íµM¡AÂI°}¹Ï¨Ã«D§¹¬üµL¯ÊÂIªº¡A¨ä®e©ö¨üÅã¥Ü³]³Æ©Î¿é¥X³]³Æªº¼vÅT¡A¥t¥~¹ïÃC¦âªº¨Ì¿à©Ê¸û¤j¡A¦]¦¹¡A¦b³æ¦â³]³Æ¤WÅã¥Ü±m¦âÂI°}¹Ïªº®ÄªGÁ`¬O¤£¯à¥O¤Hº¡·Nªº¡A¥t¥~ÂI°}¹Ï»P¹q¸£Åã¥Ü¸ÑªR«×©M¹Ï¹³Áa¾î¼e¡B°ª¤ñ¦³Ãö¡C¾¨ºÞÂI°}¹Ï¯à³Q©Ô¦ù©MÁY¤p¡A³q±`·|¦b¦ùÁY®É¼W¥[©Î§R°£¹Ï¯Àªº¬Y¨Ç¦æ©M¦C¡A³o¼Ë·|¯}Ãa¹Ï¹³ªº¤j¤p¤Î¯u¹ê©Ê¡F¦Ó¦V¶q¹Ï¦]Àx¦sªº¹Ï¹³¬O´X¦ó¸ê°T¡A¦b¼v¹³©ñ¤j¡BÁY¤p«á¤´µM¯à«O«ù¹Ï§Î¼Ë¦¡¤£¨ü§ïÅÜ(¦pª½½u©ñ¤j©ÎÁY¤p¡A¥u§ïÅܰ_²×ÂI®y¼Ð¦ì¸m)¡CÂI°}¹Ïªº²Ä¤GÓ¯ÊÂI¬O»ÝnÀx¦s®e¶qªÅ¶¡¸û¤j¡C¥H¤@±i800¡Ñ600¡A16¦â(4bbp)ªº¼v¹³¡A»Ýn¤j©ó(800¡Ñ600¡Ñ4/8/1024)234KBªºªÅ¶¡¡F¤@´T1024¡Ñ768¡A¨Ã¥B¨CӹϯÀ¬°24¦ì¤¸ÃC¦âªº¹Ï¹³«h»Ýn¤j©ó(1024¡Ñ768¡Ñ24/8/1024)2.34MB ªºªÅ¶¡¡C¦V¶q¹Ï«h»ÝnÀx¦s®e¯Ç¤ñÂI°}¹Ï¤p«Ü¦h¡CÂI°}¹ÏªºÀx¦sªÅ¶¡¨ú¨M©ó¼v¹Ï¹³ªº¤j¤p¡A¤Î¨ä¥NªíÃC¦â±j«×¨M©w¡A¦Ó¦V¶q¹ÏªºÀx¦sªÅ¶¡«h¥Ñ¹Ï¹³ªº½ÆÂøµ{«×©M¥¦©Ò¥]§tªºGDIø¹Ï«ü¥O¼Æ¶q¨M©w
21.5.1¼v¹³ ¼v¹³(Image)¬°Ã¸»s¡B½Æ»s¡BÂà´«¡Bª«¥ó¤Î®i¥Ü¥Î¹Ï¤ù(Picture)¡A¨äÄÝ©â¶HÃþ§O¡A¥²¶·³z¹L¨äl¥ÍÃþ§O¡A¦pÂI°}¹Ï©Î¦V¶q¹Ï¥H«Ø¥ß¹êÅ骫¥ó¨Ó¹ê§@¡C¦p¤U±¤ù¬qµ{¦¡´N¬O«Ø¥ßÂI°}¹Ïªº¨Ò¤l¡G
Dim bmp As New Bitmap(180, 200) ¡¥·s«Ø¼eªø¤j¤p¬°180¡Ñ200¹³¯ÀªºBitmap Using gr As Graphics = Graphics.FromImage(bmp) gr.DrawEllipse(Pens.Blue, 20, 20, 120, 160) End Using
21.5.2ÂI°}¹Ïµ²ºc ÂI°}¹Ï(Bitmap)¬O¥H¹³¯À¸ê®Æ©w¸qªºÃþ§O¡AUser¥i¥H¥Î³o¨Ç¸ê®Æ§@¼v¹³¤§¹Bºâ¡B×¥¿¡BÀx¦sµ¥³B²z§@·~¡A³o¨Ç¸ê®Æ¥i¥H¦bªí³æ¡B¹Ï§Î¤è¶ô¡B±±¨î¶µÅã¥Ü¡AÂI°}¹Ï¥iÂà¦s¬°Bmp¡BGif¡BJpeg¡BPng¡BTiffµ¥Ãþ«¬ÀɮסCÂI°}¹Ï«Ü¦h«nªºÄݩʡB¤èªk¦h¬O Ä~©Ó¦ÛImage©â¶HÃþ§O¡C ¦b¤¶²ÐÂI°}¹ÏÀÉ®×µ²ºc¤Î¹³¯À¡B¹Ï¤¸Ãö«Y«e¡AÅý§ÚÌ¥ý½Æ²ß¤@¤U¤G¶i¦ì¡B¤Q¶i¦ì»P¤Q¤»¶i¦ìª¾Ãö«Y¤Î¦p¦ó´«ºâ¡C¦p¤Q¶i¦ìªº18´«ºâ¬°¤G¶i¦ì¡G
2¡è18 -----0 (2^0=1) 2¡è9 ----1(2^1=2) 2¡è4 ----0 (2^2=4) 2¡è2 ----0 (2^3=8) 1 ---- (2^4=16)
¤G¶i¦ì°Oªk ¤@¯ë¦h±Ä¥Î°ª¾¦¸¦Ü§C¾¦¸¡A§Y(10010) 18=10010=1¡Ñ16+0¡Ñ8+0¡Ñ4+1¡Ñ2+0¡Ñ1 ¦pªG¬O¼g¹q¸£µ{¦¡¡A±z¥ç¥i¥H±Ä¥Î¥H¦r¦ê¤è¦¡¡A¥Ñ²Ä§C¾¦¸¦Ü°ª§C¾¦¸±Æ¦C 18=¡¨01001¡¨=0¡Ñ1+1¡Ñ2+0¡Ñ4+0¡Ñ8+1¡Ñ16 ª`·N¡I¤£¯à¨Ï¥Î¼ÆÈ°Oªk¡A§_«h¹q¸£·|±N¥Ñ²Ä§C¾¦¸¦Ü°ª§C¾¦¸±Æ¦C ¤§¡u01001¡v§ï¦¨¡u1001¡v¡C¦Ü©ó¨ä¥L¤Q¶i¦ì´«ºâ¬°¤K¶i¦ì¤Î¤Q¤»¶i¦ì¤§ºâªk§¡»P¤Wz§@·~¤è¦¡Ãþ¦ü¡C¥H¤Q¶i¦ì¤§6250¡A¤Q¤»¶i¦ì¬°¡G
16¡è6250-----10(16^0=1) 16¡è390 -----6(16^1=16) 16¡è24 -----8(16^2=256) 1 -----(16^3=4096)
6250=186A=1¡Ñ16^3+8¡Ñ16^2+6¡Ñ16^1+10¡Ñ16^0(°ªò»¦¸¦Ü§Cò»¦¸¡A¥H¤@Ó¦r¬°³æ¦ì) 6250=6A18=6¡Ñ16^1+10¡Ñ16^0+1¡Ñ16^3+8¡Ñ16^2(§Cò»¦¸¦Ü°ªò»¦¸¡A¥H¨âÓ¦r¬°³æ¦ì) 6250=A681=10¡Ñ16^0+6¡Ñ16^1+8¡Ñ16^2+1¡Ñ16^3 (§Cò»¦¸¦Ü°ªò»¦¸¡A¥H¤@Ó¦r¬°³æ¦ì)
¦Ü©ó¼g¹q¸£µ{¦¡®É¡A¶i¦ì¾¦¸¤Î¾l¼Æªº°Oªk¡A«hÀH±z°ª¿³¡A´N¹³²£«~³W½d¤Î³W®æ¡A·íµM¥i¥H¥Ñ¥Í²£ªÌ¦Û¤vÀÀ©w¡C¦¹ÂI¦ü¥i»¡©úÂI°}¹ÏÀÉ®×¸ê®Æ»P¹Ï¤¸¹³¯À¨âªÌ±Æ§Ç¤è¦¡¬°¦ó¥i¥H¤£¤@P¡A¥un³Ì«áµ²ªG¬O¥¿½T§Y¥i¡C
¦p¤W±¤§8 Pixel¡Ñ8Pixel¤j¤p¤§¶Â¥ÕÂI°}¹Ï(¤W¹Ï¤¤¥¡ºñ®Ø¤¤¥Õ©³¶Â½u¤p¹Ï)»P¤Ø¤o©ñ¤j¤§8¡Ñ8¤è®æ¹Ï¹ïÀ³¡A¦p¥H¤Gºû°}¦CÀx¦s¡A¤j¤p»ÝBmpBits(7,7)¦@8¡Ñ8Ӧ줸²Õ(8Óbits²Õ¦¨1ÓByte)¡C²Ä¤@¦C¤À§O¬°(1,1,1,1,1,1,1,1,1,1)¡A¦@8Ӧ줸²Õ¡A§YBmpBits(0,0)~ BmpBits(0,7)¦@¥Î8ÓBytes¨Ó¥Nªí²Ä0¦C¥þ¬°¥Õ¦â(¬°¤è«K¤ñ¹ï¸ê®ÆÀÉ®×»P¼v¹³Åã¥Ü±Æ§Ç¤£¦P¡C¦]¦¹BmpBits(0,0)¬°¥Õ¦â«D¶Â¦â)¡F²Ä1¦C«h¬°(1,0,1,1,1,1,1,1)¡A¥Nªí²Ä1¦C°£BmpBits(1,1)¬°¶Â¦â¥~¡A¨ä¾l§¡¬°¥Õ¦â¡C-----------¡C¦pªG§ï¥H¤@ºû°}¦CÀx¦s(±Æ§Ç¦p¥Ñ°ª¦Ü§C)¡A±N²Ä0¦C¤¸¯Àµø¬°: 1¡Ñ2^7+1¡Ñ2^6+1¡Ñ2^5+1¡Ñ2^4+1¡Ñ2^3+1¡Ñ2^2+1¡Ñ2^1+1¡Ñ2^0=255=&HFF=ox377 ²Ä1¦C¤¸¯Àµø¬°: 1¡Ñ2^7+0¡Ñ2^6+1¡Ñ2^5+1¡Ñ2^4+1¡Ñ2^3+1¡Ñ2^2+1¡Ñ2^1+1¡Ñ2^0=191=&HBF=ox277 «h¤Wz8¡Ñ8°}¦C¥i¥H1¡Ñ8©Î8¡Ñ1°}¦C¨ú¥N¡A¤£¦ý¤è«K¡A¤]¥i¥H¸`¬Ù³\¦h°O¾ÐÅé¡C
¤U±§Ú̦A¤¶²Ð¦p¦ó¥H8¡Ñ8¤Gºû¥¬ªL(Boolean)Ȱ}¦C¨Ó«Ø¥ß8 Pixel¡Ñ 8PixelªºÂI°}¹Ï¹q¸£µ{§Ç½X½s¼g¡C
Private Sub But8_8colorBmp_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles But8_8colorBmp.Click Dim nGrid As Integer nGrid = 8 Dim bmpBoolArray(,) As Boolean ReDim bmpBoolArray(nGrid - 1, nGrid - 1) For i As Integer = 0 To nGrid - 1 For j As Integer = 0 To nGrid - 1 bmpBoolArray(i, j) = True '¯uÈ¥Nªí¥Õ¦â '°²È¥Nªí¶Â¦â,bmpBoolArray(2,2),bmpBoolArray(3,3),bmpBoolArray(4,4) ¡¥,bmpBoolArray(5,5)bmpBoolArray(6,6),bmpBoolArray(7,7) If (i >= 1 And i = j) Then bmpBoolArray(i, j) = False ' Next Next Picshow.Width = nGrid Picshow.Height = nGrid Span = nGrid Picshow.Image = CreateBmpbyBoolArray(bmpBoolArray, nGrid) Call drawGridWB(nGrid, bmpBoolArray) '©ñ¤j¹Ï¥Ü End Sub
Private Function CreateBmpbyBoolArray(ByRef Matx(,) As Boolean, ByVal bmpWidth As Integer) As Image Dim Height As Integer 'ÂI°}¹Ï°ª«× Height = Matx.Length \ bmpWidth Dim Bmp As New Bitmap(bmpWidth, Height) For jY As Integer = 0 To Height - 1 '¤ô¥±½ºË For iX As Integer = 0 To bmpWidth - 1 If Matx(jY, iX) = True Then Bmp.SetPixel(jY, iX, Color.White) Else Bmp.SetPixel(jY, iX, PickedColor) End If Next Next Return Bmp End Function
Private Sub drawGridWB(ByVal nGrid As Integer, ByVal Matx(,) As Boolean) Dim bmp As New Bitmap(PicEnlarge.Width, PicEnlarge.Height) Dim Xyspace As Single = (PicEnlarge.Width - 1) / nGrid Dim bmpf As New Bitmap(bmp) ReDim Preserve Matx(nGrid - 1, nGrid - 1) Dim i, j As Integer Dim g1 As Graphics = Graphics.FromImage(bmpf) For j = 0 To nGrid - 1 For i = 0 To nGrid - 1 Dim Rect As New RectangleF(i * Xyspace, j * Xyspace, Xyspace, Xyspace) Dim tBrush As Brush If Matx(i, j) = True Then tBrush = New SolidBrush(Color.White) Else tBrush = New SolidBrush(Color.Black) End If
g1.FillRectangle(tBrush, Rect) Next Next Dim penuse As New Pen(Color.Gray) penuse.DashStyle = DashStyle.Solid '.Dash For i = 0 To PicEnlarge.Height Step Xyspace g1.DrawLine(penuse, 0, i, PicEnlarge.Width, i) Next i For i = 0 To PicEnlarge.Width Step Xyspace g1.DrawLine(penuse, i, 0, i, PicEnlarge.Height) Next i PicEnlarge.Image = bmpf bmp = New Bitmap(PicEnlarge.Image) End Sub ¡@§Q¥Î¤Wzµ{¦¡¡A¥i¥H±NÂI°}¹ÏÀx¦s¦¨bmp¹ÏÀÉ¡AµM«á§Q¥ÎUltraEditŪ¥Xbmp¤º®e¦p¤U¡G
©Î§Q¥Îµ{§ÇŪ¥X¹³¯À¸ê®ÆÀɮצp¤U©Ò¥Ü¡G
n¸ÑŪ¤Wz¸ê®Æ¡A´N¥²¶·ÁA¸ÑÂI°}¹ÏªºÀÉ®×µ²ºc¡CÂI°}¹ÏÀÉ®×µ²ºc¥]§t¥|Ó¥Dn³¡¥÷: (1)Bitmap File Header (ÂI°}¹ÏÀÉÀY) (2)Bitmap Info Header (ÂI°}¹ÏÀÉÀY¸ê°T) (3)Color Table (Palette) (ÂI°}¹Ï½Õ¦âªO) (4)Bitmap Array(ÂI°}¹Ï¹³¯ÀÃC¦â)
¹ï·Ó¤Wz¤§ÂI°}¹Ï¡A§Ú̱N¨ä¾ã²z¦p¤Uªí¥H¤è«K¸Ñ»¡¡C
(1) ²Ä0¤Î²Ä1Ӧ줸²Õ¬°(42 4D)¡A²Ä0¦ì¤¸²Õªº¤Q¤»¶i¦ì¼Æ¥Ø¬°42(¤Q¶i¦ì¬°16¡Ñ4+2=66)¡A²Ä1Ӧ줸²Õ¬°4D(¤Q¶i¦ì¬°16¡Ñ4+13=77)¡A¹ï·Ó^¤å¦r¥ÀªºASCII½X¬°¤j¼gªºB¤ÎM¡A¦¹¥NªíÂI°}¹ÏÃþ«¬¬°¡uBM¡vÃþ«¬¡C (2) ²Ä2ӤβÄ5¦ì¤¸²Õ¬°(36 01 00 00)¡AÂI°}¹Ï¹ÏÀÉ¸ê®ÆÀx¦s¤è¦¡¬O§C¦ì¤¸²Õ¦b«e¡A°ª¦ì¤¸²Õ¦b«á¡An´«ºâ¬°¤Q¶i¦ìÀ³¸Ó¬°00 00 01 36(¥H¦ì¤¸²Õ¬°³æ¦ì,¦]¦¹«D0163)¡A´«ºâ¬°¤Q¶i¦ì¬°(1*16^2+3*16^1+6=310)310 bytes¡A¦¹¬°ÂI°}¹ÏÀÉ®×¸ê®Æ¤j¤p(¥]¬AÀÉÀY¦b内¤§©Ò¦³Äæ¦ì)¡C (3) ²Ä6¦Ü¨ì²Ä9¦ì¤¸²Õ¦@4Ӧ줸²Õ(00 00 00 00)§¡¬°0¡A¦¹¬°«O¯dÄæ¦ì¡C (4) ²Ä10¦Ü²Ä13¦ì¤¸²Õ(00 00 36 00)¡A¤Q¶i¦ì¬°54¡A¦¹¬°ÂI°}¹Ï¸ê®Æ¶}©l¤§«eªº°¾²¾¶q(«üÂI°}¹Ï¹³¯ÀÃC¦â¸ê®Æ¥Ñ¦¹Äæ¦ì°_ºâ)¡C (5) ²Ä14¦Ü²Ä17¦ì¤¸²Õ(28 00 00 00)¡A¤Q¶i¬°40¡A¦¹¬°ÀÉÀY¸ê®ÆÄæ¦ì¤j¤p¡C (6) ²Ä18~21¦ì¤¸²Õ(08 00 00 00)¬°ÂI°}¹Ï¤ô¥¤è¦V¼e«×¡A¤Q¶i¦ì¬°8¡A¬°8 pixels¡C (7) ²Ä22~25¦ì¤¸²Õ(08 00 00 00)¬°ÂI°}¹Ï««ª½¤è¦V¼e«×¡A¤Q¶i¦ì¬°8¡A¬°8 pixels¡C (8) ²Ä26~27¦ì¤¸²Õ(01 00)¬°ÂI°}¹Ïªº¦ì¤¸¹Ï¼h¼Æ¡A¤Q¶i¦ì¬°1¡C (9) ²Ä28~29¦ì¤¸²Õ(20 00)¬°ÂI°}¹Ïªºbpp¡A¤Q¶i¦ì¬°32¡A¨CÓ¹³¯ÀÃC¦â»Ýn32¦ì¤¸¼Æ(4 bytes)¡C (10) ²Ä30~33¦ì¤¸²Õ(00 00 00 00)¡A¤Q¶i¦ì¬°0¡A¥NªíÂI°}¹Ï¤£À£ÁY¡C (11) ²Ä34~37¦ì¤¸²Õ(00 0 00 00)¡A¤Q¶i¦ì¬°0¡A¦]¬°¤£À£ÁY¡A¬GÂI°}¹Ï¹³¯ÀÀɮפj¤p ¥i¥H³]©w¬°0¡C (12) ²Ä38~41¦ì¤¸²Õ(C4 0E 00 00)¡A¤Q¶i¦ì¬°3780 bytes/m¡A´«ºâ«á¬°96 dpi¡A§Y¤ô¥¸ÑªR«×¬°96 dpi¡C (13) ²Ä42~45¦ì¤¸²Õ(C4 0E 00 00)¡A¤Q¶i¦ì¬°3780 bytes/m¡A´«ºâ«á¡A««ª½¸ÑªR«×¬°96 dpi¡C (14) ²Ä46~49¦ì¤¸²Õ(00 00 00 00)¡A¤Q¶i¦ì¬°0¡A½Õ¦â½LÃC¦â¬°0¡Aªí¥Ü¤£¨Ï¥Î½Õ¦â½L¡C (15) ²Ä50~53¦ì¤¸²Õ(00 00 00 00)¡A¤Q¶i¦ì¬°0¡Aªí¥Ü¥ô¦óÃC¦â³£«n¡C (16) ²Ä54¦ì¤¸²Õ°_¡A¨C4Ӧ줸²Õ¥NªíÂI°}¹Ï¤W¤@Ó¹³¯ÀÃC¦â¡A±q²Ä54¦ì¤¸²Õ°_¦Ü²Ä81¦ì¤¸²Õ¡A¦@¦³28Ó¡¨FF¡¨(¨C4ÓFF¥Nªí1Ó¥Õ¦âºô®æ)¡A«á±±µ1²Õ¡¨00 00 00 FF¡¨(¥Nªí1®æ¶Â¦âºô®æ)«á¡A¦A±µ28Ó¡¨FF¡A¡K¡K¡K¡C³Ì«á1²Õ¡¨00 00 00 FF¡¨«á±¡A¦A±µ56Ó¡¨FF¡¨(14 pixels)¡C (17) ¤W±»¡©ú¦pªGÁÙ¤£²M·¡¡A½Ð¬Ý¤U±¤§¹Ï¥Ü´N¯àÁA¸Ñ¤@¤Á¡C
(a)¿Ã¹õ©ÒÅã¥Ü¤§ÂI°}¹Ï(±½ºË¤è¦V¥Ñ56~63,48~55,¡K¡K¡K,1~7)
(b)ÂI°}¹Ï¸ê®ÆÀɮױƦC¤è¦¡
¤W±¤§¹Ï¹³¹³¯À±Æ¦C¡A¦b¿Ã¹õ¤W±Æ¦C¬O¥Ñ¥ª¤W¨ì¥k¤U¡F¦b¸ê®ÆÀÉ(°O¾ÐÅ餤)¬O¥Ñ¥Ñ¥ª¤U¨ì¥k¤W¡A§Y¿Ã¹õ¤W³Ì¤W¤@¦C¡A¦b°O¾ÐÅé¬O³Ì¤U¤@¦C(¤W¤U¹ï½Õ¡A¥ª¥k¤£ÅÜ)¡C¥H¥»¨ÒÃD¨Ó»¡¡A¦]¬°¬O¶Â¥Õ¨â¦â¹ÏÀÉ¡A¥u¯à¬Ý¥X¨âªÌ±Æ§Ç¤§®t²§¡A©|¤£¯à¬Ý¥XRGBÃC¦â¦¨¥÷¬O§_¦³ÅܤÆ(00 00 00 ©ÎFF FF FF¡A¦]¬°¥ª¥k¹ï±¼¡A¤´µM¬O00 00 00 ¤ÎFF FF FF)¡C²{¦b¡A§Ú̦AÁ|¤@Ó8¡Ñ8±m¦â¹Ï¹³¡A¬Ý¬ÝÂI°}¹Ï¹³¯ÀÃC¦â¬O¦p¦ó±Æ¦C¡H
¥»¨ÒÃD¤§±m¦âÀÉ®×»P«ez¶Â¥ÕÀÉ®×°£¹³¯ÀÃC¦â¦³¤£¦P¥~¡A¨ä¾l³£¤£ÅÜ¡C¥Ñ²Ä¤@Ӧ줸²Õ°_ºâ¡A²Ä¤@ÓÃC¦â¸ê®Æ(¦ì¤¸²Õ54~57)¬°(00 00 00 FF)¡A²Ä¥|ÓFF¬°RGB¤§AÈ(ÃC¦â³q¹D)¡A«e±¤TÓ00¤£½×¬ORGB©Î¬OGBR¦h¨S®t§O¡A³£¥Nªí¶Â¦â¡F©Ò¥H¡A§ÚÌ©¹¤U¬Ý²Ä¤GÓÃC¦â¸ê®Æ(¦ì¤¸²Õ58~61)¬°(FF F8 F0 FF)¡A«e±¤TӦ줸²Õ¤Q¶i¦ì¬°(255 248 240)¡A¤ñ¹ï¨Ï¥ÎÃC¦âÀ³¬OAliceBlue(240 248 255)RGBȤ§°f¦V±Æ¦C¡A§YBGR¬°(255 248 240)¡C¦b¦AÀˬd²Ä¤TÓºô®æÃC¦â¸ê®Æ(¦ì¤¸²Õ58~61)¬°(8B 00 8B FF)¤Q¶i¦ì¬°(139 00 139)¡A¦]¥ª¥k¹ïºÙ¼È¤©«O¯d¡C¦A¬Ý¤U¤@Ó¹³¯À(50 7F FF FF) ¤Q¶i¦ì¬°(80 127 255)¬°CoralªºRGBÃC¦â°f¦V±Æ¦C¡A¦]¦¹§Ú̽T©w(8B 00 8B FF)À³¬°DarkMagentaÃC¦â°f¦V±Æ¦CµL»~¡CÂI°}¹Ï¸ê®Æ²Ä¤@Ó¹³¯À¹ïÀ³¬°ÃC¦â°}¦C²Ä56Óºô®æ¡A¦P¬°¶Â¦â¡C¨ä¾l¥ç¬O¤@¤@¹ïÀ³¡C 21.5.3Ū¨úÂI°}¹Ï¸ê®Æ ¤U±§Ṳ́¶²Ð¦p¦óŪ¼gÂI°}¹Ï¸ê®Æ¡H«e±§ÚÌ´¿´£¤Î¡A¨C¤@±½´y¦Cªºªø«×¥²»Ý¬O 4 byte ªº¿¼Æ¡A¦³¨Ç¹ÏÀÉ¡A¥i¯à´N·|¦³¤£¬O4 byteªº¿¼Æ¡C¦p¤U±¬°9¡Ñ8 pixels¤§ÂI°}¹Ï¡A¨C¤@Ó¹³¯ÀÃC¦â»Ýn¤TӦ줸²Õ¡A¼e«×¬°9 pixels¦@¶·27Ӧ줸¼Æ¡A¹ê»Ú¦bÀx¦s®É»Ýn28Ӧ줸²Õ¡A¦¹¦h¥Îªº¤@Ӧ줸²Õ¡A³£¥H00¶ñ¸É¡C¦³¤HºÙ¦¹¶ñ¸É¥Îªº¦ì¤¸²Õ¬°Junkbytes¡AJunkbytesªº¼Æ¥Ø»P±½ºË¦æ(Scaleline©ÎStride)¼e¦³Ãö¡A±½ºË¦æpºâ¤½¦¡¬°¡G¡@ ±½ºË¦æLineOfBytes=((biWidth*biBitCount+31)And &HFFFFFFE0)\8 ¥H¥»ÂI°}¹Ï¬°¨Ò¡AbiWidth=9¡AbiHeight=8¡AbiBitCount =24¡ALineOfBytes=28¡AJunkbites=1¡C
¦Ü©ó¤Wz¸ê®Æ¦p¦ó¨ú±o¡A°£¨Ì«e±©Ò¤¶²Ð¤§¤è¦¡¡A§Q¥ÎUltraEdit³nÅéŪ¨ú¸ê®Æ«á¡A§Q¥Î®{¤âpºâ¤è¦¡¨ú±o¥~¡A©|¥i¥H©w¸qÂI°}¹Ï¸ê®Æµ²ºc¡A§Q¥ÎÀɮ׬y(Filestrem)Ū¨ú¡C ¹ïÀ³«e±ÂI°}¹Ïµ²ºc¡A§ÚÌ¥i¥H©w¸qBITMAPFILEHEADER¡ABITMAPINFOHEADER¤ÎRGBQUADµ²ºc¦p¤U¡G
(1¡^BITMAPFILEHEADER(BMPÂI°}¹ÏÀÉÀY)ªºVB NETÁn©ú¦p¤U¡G Private Type BITMAPFILEHEADER bfType As Integer ¡¥ÀÉ®×Ãþ«¬ bfSize As Long ¡¥ÂI°}¹ÏÀɪº¤j¤p bfReserved1 As Integer ¡¥¥Ø«e«O¯d bfReserved2 As Integer ¡¥¥Ø«e«O¯dbfReserved1»PbfReserved2¥i¦X¨Ö bfOffBits As Long ¡¥ÂI°}¹Ï¸ê®Æ¶ZÂ÷ÀÉÀYªº°¾²¾¦ì¤¸²Õ¼Æ End Type
¡]2¡^BITMAPINFOHEADER(ÂI°}¹ÏÀÉÀY¸ê°T)ªºVB NETÁn©ú¦p¤U¡G Private Type BITMAPINFOHEADER '40 bytes biSize As Long ¡¥BITMAPINFOHEADERµ²ºcªº¤j¤p biWidth As Long ¡¥ÂI°}¹Ïªº¼e«×(¹Ï¤¸) biHeight As Long ¡¥ÂI°}¹Ïªº°ª«×(¹Ï¤¸) biPlanes As Integer ¡¥³]³Æªº¦ì¤¸¥±¼Æ biBitCount As Integer ¡¥¹Ï¹³ªºÃC¦â¦ì¤¸¼Æ¡A¥i¥H¬°1,4,8,16,23,32 ¤¤¤§1 biCompression As Long ¡¥¹Ï¹³ªºÀ£ÁY¤è¦¡ biSizeImage As Long ¡¥¹ê»ÚªºÂI°}¹Ï¸ê®Æ©Ò¥e¦ì¤¸²Õ biXPelsPerMeter As Long ¡¥Åã¥Ü³]³Æ¤ô¥¤è¦V¸ÑªR«×(¹Ï¤¸Ó¼Æ/M) biYPelsPerMeter As Long ¡¥Åã¥Ü³]³Æ««ª½¤è¦V¸ÑªR«×(¹Ï¤¸Ó¼Æ/M) biClrUsed As Long ¡¥©Ò¨Ï¥ÎªºÃC¦â¼Æ biClrImportant As Long ¡¥«nªºÃC¦â¼Æ End Type ¡@¡@ (3)RGBQUAD(ÂI°}¹Ï½Õ¦âªO) ªºVB NETÁn©ú¦p¤U¡G Private Type RGBQUAD rgbBlue As Byte ¡¥ÂŦ⦨¤À¼ÆÈ rgbGreen As Byte ¡¥ºñ¦â¦¨¤À¼ÆÈ rgbRed As Byte ¬õ¦â¦¨¤À¼ÆÈ rgbReserved As Byte End Type
¤Wz¦U¶µ°Ñ¼Æ©Ò¥Nªí¤§·N¸q¡A½Ð°Ñ¦Ò«e±¬ÛÃö»¡©ú¡C ¦³ÃöÂI°}¹Ï¸ê®ÆÅª¨úµ{§Ç½s¼g§@·~¡A¥i¥HÂk¯Ç¦¨¤U¦C´XÓnÂI¡G
(1) ¶}±ÒÂI°}¹Ï¸ê®Æ¸ê®ÆÀÉ (2) «Ø¥ß¸ê®Æ¬yª«¥ó Dim fs0 As New FileStream(bmpFileName, FileMode.Open, FileAccess.Read) (3) Ū¤J¦ì¤¸¸ê®Æ¨ÃÀx¦s¦ÜBuffer() (4) §Q¥Î¶°¦X(Collection)Àx¦sÂI°}¹Ï¹³¯ÀÃC¦â¸ê®Æ(¥H±½ºË½u¼e¬°³æ¦ì¡A§t¶ñ¥R¥Î¦ì¤¸²Õ) (5) ¤Ï¦V±Æ¦C¶°¦X¶µ¥Ø (6) ¤ÀÂ÷°}¹Ï¹³¯ÀÃC¦â¸ê®Æ(±Ë¥h¶ñ¥R¥Î¦ì¤¸²Õ)³Æ¥Î¡C (7) ¦ì¤¸¼v¹³³B²z
¤Wz§@·~«Y¥Î¶°¦X¤§±Æ¦CÆ[©À¡A²¼ä¤£©ö¥X¿ù¡C¬°¤è«KŪªÌÁA¸Ñ¡Aµ{¦¡½s¿è«D±`ª½±µ¡A¨S¦³ªá«N¡AŪªÌ¥i¥H¦bÁA¸Ñ¥þ³¡¤º®e«á¡A±N¨ä§ï½s§óºë²¡A³Ì«á°O±oÄÀ©ñ¶°¦X©Ò¨Ï¥Î¤§°O¾ÐÅé¡C
Private Sub FileReadOut(ByRef buffer() As Byte, ByRef ImgBGR(,,) As Byte) Form2.Show() Dim bufferP() As Byte Dim bmpFileName As String If OpenFileDialog1.ShowDialog = DialogResult.OK Then bmpFileName = OpenFileDialog1.FileName Try '--------------------------------- Label1.Text = bmpFileName Dim fs0 As New FileStream(bmpFileName, FileMode.Open, FileAccess.Read) Dim hFile As Integer = FreeFile() Dim br As New BinaryReader(fs0) Dim s As String Dim bibmpHeadSize As UInt32 Dim biWidth As UInt32 Dim biHeight As Int32 Dim biPlane As UInt16 Dim BitsPerPix As UInt16 Dim biCompress As UInt32 Dim biImageSize As UInt32 Dim biXpixsPerMeter As UInt32 Dim biYpixsPerMeter As UInt32 Dim biColorused As UInt32 Dim biColorImport As UInt32 '----------------------- Dim bfType As UInt16 Dim bfSize As UInt32 Dim biReserved As UInt32 Dim bfOffsetBits As UInt32 fs0.Seek(0, SeekOrigin.Current) s = br.ReadChars(2) Form2.ListBox1.Items.Add(s) If s <> "BM" Then MsgBox("¹ï¤£°_???«DBMÃþ§Î¸ê®ÆÀÉ,µLªk§PŪ?") Exit Sub End If If s = "BM" Then
Label1.Text += " _BmpÃþ«¬" '------------------------------------------ fs0.Seek(0, SeekOrigin.Current) bfSize = br.ReadUInt32() biReserved = br.ReadUInt32() bfOffsetBits = br.ReadUInt32() bibmpHeadSize = br.ReadUInt32() biWidth = br.ReadUInt32() biHeight = br.ReadInt32() biPlane = br.ReadUInt16() BitsPerPix = br.ReadUInt16() biCompress = br.ReadInt32() biImageSize = br.ReadUInt32() biXpixsPerMeter = br.ReadUInt32() biYpixsPerMeter = br.ReadUInt32() biColorused = br.ReadUInt32() biColorImport = br.ReadUInt32() '-------------------------- ListBox1.Items.Add("BmpHeadSize =" + bibmpHeadSize.ToString & " bytes") ListBox1.Items.Add("Bmp_with =" + biWidth.ToString & " Pixels") ListBox1.Items.Add("bmp_Height =" + biHeight.ToString & " Pixels") ListBox1.Items.Add("biPlane =" + biPlane.ToString) ListBox1.Items.Add("BitsPerPix =" + BitsPerPix.ToString & " bbp") ListBox1.Items.Add("¸ê®ÆÀ£ÁY¼Ò¦¡ =" + biCompress.ToString) ListBox1.Items.Add("biImageSize(¹³¯À¸ê®Æ¼Æ)= " + biImageSize.ToString & " byte") ListBox1.Items.Add("biXpixsPerMeter=" + biXpixsPerMeter.ToString & "(Pixel/m)= " & (biXpixsPerMeter \ 39.37).ToString & " dpi") ListBox1.Items.Add("biYpixsPerMeter =" + biYpixsPerMeter.ToString & "(Pixel/m)= " & (biYpixsPerMeter \ 39.37).ToString & " dpi") ListBox1.Items.Add("UseColrs =" + biColorused.ToString) ListBox1.Items.Add("ImportCols =" + biColorImport.ToString) ListBox1.Items.Add("bfType= " + s) 'bfType.ToString & "bytes" ListBox1.Items.Add("bfSize(ÀÉ®×Á`¸ê®Æ¼Æ)= " + bfSize.ToString & "bytes") ListBox1.Items.Add("biReserved= " + biReserved.ToString) ListBox1.Items.Add("bfOffsetBit= " + bfOffsetBits.ToString & "bytes")
Select Case biCompress Case 0 Label1.Text += "¥¼À£ÁY" Case 1 Label1.Text += "RLE-8(8-bit/pixel)" Case 2 Label1.Text += "RLE-4(4-bit/pixel)" Case Else Label1.Text += "Bitfields" End Select End If br.Close() fs0.Close() '---------------------------------------- Dim fs As FileStream = File.Open(bmpFileName, FileMode.Open) ReDim buffer(fs.Length) fs.Read(buffer, 0, fs.Length) For i As Integer = 0 To bfOffsetBits -1 ¡¥=53 'fs.Length Form2.ListBox1.Items.Add("buffer= " & i.ToString & ":" & Hex(buffer(i))) ReDim Preserve bufferP(i) bufferP(i) = buffer(i) Next i
Dim istep As Integer = BitsPerPix \ 8 MsgBox("istep= " & istep) Dim count As Integer = 0 Dim lineOfBytes = ((biWidth * BitsPerPix + 31) And &HFFFFFFE0) \ 8 'scanline MsgBox("lineOfBytes" & lineOfBytes & "; biheight= " & biHeight) Dim endByte As Integer = lineOfBytes - istep * biWidth MsgBox("endByte = " & endByte) Form2.ListBox1.Items.Add("lineOfBytes" & lineOfBytes & "; biwidth= " & biWidth & ";biheight= " & biHeight) Form2.ListBox1.Items.Add("endByte(Junk byte) " & endByte) Form2.ListBox1.Items.Add("(bfSize-bfOffsetBits)/lineOfBytes-biHeight=0? =" & ((bfSize - bfOffsetBits) / lineOfBytes - biHeight).ToString) '¨ú¶°¦X Dim countI As Integer = 0 Dim bytesColl As New Collection Dim stbyte As String = "" For i = bfOffsetBits To fs.Length If countI < lineOfBytes Then If countI = 0 Then stbyte = buffer(i) Else stbyte = stbyte & "," & buffer(i) End If countI += 1 End If If countI = lineOfBytes Then bytesColl.Add(stbyte) countI = 0 stbyte = "" End If Next For i = 1 To bytesColl.Count Form2.ListBox1.Items.Add(bytesColl.Item(i)) ' Next '
'¨ú°f¦V¶°¦X Form2.ListBox1.Items.Add("?----------------------------?") Dim bytesCollRev As New Collection For i = bytesColl.Count To 1 Step -1 bytesCollRev.Add(bytesColl.Item(i)) Next For i = 1 To bytesCollRev.Count Form2.ListBox1.Items.Add(bytesCollRev.Item(i)) Next '¤ÀÂ÷°f¦V¶°¦X¨ú¥XBGR Dim starray() As String ReDim ImgBGR(biHeight - 1, biWidth - 1, istep - 1)
For i = 1 To bytesCollRev.Count countI = 0 starray = Split(bytesCollRev.Item(i), ",", -1, CompareMethod.Text) If countI < (lineOfBytes - endByte) Then For j = LBound(starray) To UBound(starray) - endByte ImgBGR(i - 1, j \ istep, j Mod istep) = starray(j) Form2.ListBox1.Items.Add("BGR(" & (i - 1).ToString & "," & (j \ istep).ToString & "," & (j Mod istep).ToString & " )= " & ImgBGR(i - 1, j \ istep, j Mod istep)) Next End If countI += 1 Next
'Åã¥Ü즳¹Ï§Î Dim mStream As New MemoryStream(buffer) Dim img As New Bitmap(mStream) picOrg.Width = biWidth picOrg.Height = biHeight picOrg.Image = img Call drawGrid3DCol(picOrgEnlarge, biWidth, biHeight, ImgBGR)
End Sub
21.5.4§Q¥ÎÂI°}¹Ï¸ê®Æ·s«ØÂI°}¹Ï ÂI°}¹Ï¸ê®ÆÅª¥X«á¡A¥i§Q¥Î°}¦CÀx¦s¡A°}¦CÀx¦s®É¥i±NÀÉÀY¸ê®Æ¡B¦âªO¸ê®Æ(¦pªG¦³ªº¸Ü¡A¥Ø«e¹q¸£¦h±Ä¥Î24¦ì¤¸¥H¤W¡A¬G¦¹³¡¥÷¤£ÀÀ°Q½×)¤Î¹³¯ÀÃC¦â¸ê®Æ¤À§OÀx¦s¡CÀÉÀY¸ê®Æ¡A¤@¯ë¦h¤£·|§ïÅÜ¡A·|§ïÅܪº¥Dn¬O¹³¯ÀÃC¦â¸ê®Æ¡C¦p«ez¤§¶Â¥Õ8¡Ñ8 pixels¤§ÂI°}¹Ï¡A§ÚÌ¥i¥H±NÃC¦â¸ê®Æ©Î(¤Î)¦ì¸m±Æ¦C§ïÅÜ«áÀx¦s¦^³Æ¥÷ªºÂI°}ÀÉ®×¥H«Ø¥ß·sÂI°}¹Ï¡C¤U±¤§µ{¦¡½X¬O±NÂI°}¹Ï¹³¯ÀÃC¦â¸ê®Æ¤§BGR¦¨¥÷¡A¥H(255-즳BGR)¤¬¾l(Complement)«á¡A±N¸ê®Æ¼g¦^ìÀÉ®×§Q¥ÎPixtureBoxÅã¥Ü¦¨ªG¤§¤ù¬qµ{¦¡½X¡C Sub BmpFileWriteBack(ByRef buffer() As Byte, ByVal biWidth As Integer, ByVal biHeight As Integer, ByVal bfOffsetBits As Byte, ByVal pixPerBits As Integer, ByVal Stride As Integer, ByVal EndByte As Byte, ByRef ImgBGR(,,) As Byte) Dim countI As Integer '¬Û¯ÀÃC¦â¤¬¾l() Dim pixsPerbyte = pixPerBits / 8 For I As Integer = 0 To biHeight - 1 For J As Integer = 0 To biWidth - 1 For K As Integer = 0 To pixsPerbyte - 1 If K <= 2 Then ImgBGR(I, J, K) = 255 - ImgBGR(I, J, K) End If Next K Next J Next I Dim bytesCollMod As New Collection Dim stTpt As String '¥¿¦V¼g¤J¶°¦X For I As Integer = 0 To biHeight - 1 countI = 0 For J As Integer = 0 To biWidth - 1 For K As Integer = 0 To pixsPerbyte - 1 If countI = 0 Then stTpt = ImgBGR(I, J, K).ToString If countI >= 1 And countI <= Stride Then stTpt = stTpt & "," & ImgBGR(I, J, K).ToString countI += 1 Next K Next J If EndByte >= 1 Then For k As Integer = 0 To EndByte - 1 stTpt = stTpt & "," & "00" '¥[¤J¶ñ¥R¥Î¦ì¤¸²Õ Next k End If bytesCollMod.Add(stTpt) Form2.ListBox1.Items.Add(Trim(stTpt)) Next I '¶°¦X¤Ï¦V Dim bytescollmodRev As New Collection For i = bytesCollMod.Count To 1 Step -1 bytescollmodRev.Add(bytesCollMod.Item(i)) Next Dim stArray() As String '¼g¦^ìbuffer countI = bfOffsetBits For i = 1 To bytescollmodRev.Count stArray = Split(bytescollmodRev.Item(i), ",", -1, CompareMethod.Text) For j As Integer = LBound(stArray) To UBound(stArray) buffer(countI) = stArray(j) countI += 1 Next Next Dim mStream As New MemoryStream(buffer) Dim img As Bitmap = New Bitmap(mStream) picMod.Width = biWidth picMod.Height = biHeight Me.picMod.BackgroundImage = img 'Åã¥Ü¹Ï§Î Call drawGrid3DCol(picModEnlarge, biWidth, biHeight, ImgBGR) End Sub
(a)Àx¦s¹ÏÀÉ¡G ÂI°}¹Ï¥i¥Hª«¥óÀx¦s¦¨ÀɮסAÂI°}¹ÏÀx¦s¹w³]Àɮ׮榡¬°Png®æ¦¡¡A¦]¦¹¦pÀx¦s¦¨PngÀÉ¥u»Ýn¿é¤JÀɦW¡A¨ä¾l®æ¦¡«hÀ³¥t¿é¤J®æ¦¡¦WºÙ¡C¤U±¤§µ{¦¡½X¬°¥ý¦bBitmap¤Wµe¹Ï«á¡A¦A§Q¥ÎÀÉ®×Àx¦s¹ï¸Ü¤è¶ô(SaveFileDialog)¤¤¿é¤J±ýÀx¦sªº¹ÏÀɦWºÙ(***)¡A¤À§OÀx¦s¦¨***.bmp¡B***.jpg¡B***.gif®æ¦¡¹ÏÀÉ¡C
'«Ø¥ß¦p¹Ï§Î¤è¶ôPicturebox1¤j¤pªºÂI°}¹Ïª«¥ó Dim Filename As String Dim myBmp As New Bitmap(PictureBox1.Width, PictureBox1.Height) ' «Ø¥ßø¹Ïª«¥ó. Dim gr As Graphics = Graphics.FromImage(myBmp) ' ¦bø¹Ïª«¥ó¤Wø¹Ï. gr.FillRectangle( _ New SolidBrush(Color.LightGreen), _ 0, 0, Me.ClientSize.Width, Me.ClientSize.Height) '«Ø¥ß¯x§Îª«¥ó Dim rect As New Rectangle(5, 5, _ myBmp.Width - 10, myBmp.Height - 10) gr.FillEllipse( _ New HatchBrush(HatchStyle.LightDownwardDiagonal, _ Color.Black, Color.Yellow), _ rect) gr.DrawEllipse(New Pen(Color.Blue, 3), rect) ' Åã¥Üµ²ªG. PictureBox1.Image = myBmp myBmp = PictureBox1.Image If dlgSaveDigFile.ShowDialog() = DialogResult.OK Then Filename = dlgSaveDigFile.FileName End If ' Àx¦s¦¨bitmap, JPEG, GIF®æ¦¡. myBmp.Save(Filename & ".bmp", System.Drawing.Imaging.ImageFormat.Bmp) myBmp.Save(Filename & ".jpg", System.Drawing.Imaging.ImageFormat.Jpeg) myBmp.Save(Filename & ".gif", System.Drawing.Imaging.ImageFormat.Gif) MsgBox("Ok")
(b)¸ü¤J¹ÏÀÉ¡G
¸ü¤J¹ÏÀÉ»PÀx¦s¹ÏÀɧ@·~¤è¦¡Ãþ¦ü¡A¥i¥H§Q¥ÎÀÉ®×¶}±Ò¹ï¸Ü¤è¶ô(OpenFileDialog)¸ü¤J»ÝnªºÀɮסC¦³Ãöµ{¦¡½Xªº½s¼g¦p¤U©Òz¡G
Dim filename As String If dlgOpenDigFile.ShowDialog() = DialogResult.OK Then filename = dlgOpenDigFile.FileName End If '¸ü¤JÂI°}¹Ï Dim mybmp As New Bitmap(filename) ' Åã¥Ü¦¨ªG. PictureBox1.Image = mybmp PictureBox1.SizeMode = PictureBoxSizeMode.Normal
21.5.3¹³¯À³B²z ÂI°}¹Ï´£¨Ñ¨âºØ¹³¯Àªº³B²z¤èªk¡G(1)Â^¨ú¹³¯À(GetPixel)¡A¤Î(2)§G³]¹³¯À(SetPixel)¨âºØ¤èªk§@¬°¹³¯À¹Bºâ³B²zªº§@·~°ò¦¡CGetPixel»PSetPixel§@·~§¡¶·¦bBitMap°O¾ÐÅ餤³B²z¡A¹Bºâ³B²z§¹¦¨«á¦AÂÇ¥ÑForm©ÎPictureBox¨ÓÅã¥Ü§@·~µ²ªG¡AµLªkª½±µ¦bForm©ÎPictureBox¤W§@·~¡C¦p»Ýª½±µ¦bForm©ÎPictureBox¤£³z¹LForm©ÎPictureBox«h¥i¥HÂÇWindow API¨Ó§¹¦¨¡C¤U±¤§¤ù¬qµ{¦¡½X¬°VB NET¨å«¬ªºGetPixel»PSetPixel§@·~¤è¦¡¡C
Dim clr As Integer Dim xmax As Integer Dim ymax As Integer Dim x As Integer Dim y As Integer ' ¨ú±oÂI°}¹Ï¤Î¤Ø¤o. Dim yans As Integer = MsgBox("¬O§_¨ú±oÂI°}¹Ï(*.Bmp)?", MsgBoxStyle.YesNo) If yans = 7 Then MsgBox("½Ð¸ü¤J¹ÏÀɫ᫨Ó") Exit Sub End If Dim mybmp As Bitmap = PictureBox1.Image xmax = mybmp.Width - 1 ymax = mybmp.Height - 1 ' Âà´«¦¨¦Ç¶¥¹Ï¤ù. For y = 0 To ymax For x = 0 To xmax With mybmp.GetPixel(x, y) ¡¥Â^¨ú¹³¯À clr = 0.3 * .R + 0.5 * .G + 0.2 * .B End With mybmp.SetPixel(x, y, _ Color.FromArgb(255, clr, clr, clr)) ¡¥¾Q³]¹³¯À Next x Next y ' Åã¥Ü¹Ï¤ù. PictureBox1.Image = mybmp
¤W±ªº BitMap.GetPixel()¤ÎBitMap.SetPixel()¤èªk¡A³£¥²¶·¦bBitMap¤¤§@·~¡AµLªkª½±µ¦b¹Ï§Î¤è¶ô¤¤ª½±µ¾Þ§@¡CÁ|¨Ò¨Ó»¡¡A¦pUser¦b¹Ï§Î¤è¶ôµe¤@Ó³¬¦X¦hÃä§Î¡A»ÝnÂ^¨ú³¬¦X°Ï°ì¹³¯ÀÃC¦â¡A«h»Ý±N¹Ï§Î¼È®ÉÀx¦s¦¨BitMapÀÉ¡A¸ü¤JBitMapÀÉ«á¡A¦A¥ÑBitMap¼v¹³¸ê®Æ¤¤Â^¨úÃC¦â¡A¦b¤¬°Ê¦¡Ã¸¹Ïµ{¦¡³]p§@·~¤¤¤£¬Æ¤è«K¡A¤U±§ÚÌ´N¤¶²Ð¥t¥~¤@ºØ¤£»Ý¸g¹LÀx¦s¦¨BitMapÀɮתº§@·~¤è¦¡¡C
'(1)¥ý±N¹Ï¤¸µe¦bBitmap¤W '(2)¦bBitmap¤W¾Þ§@GetPixel¤ÎSetPixel '(3)¦bForm©ÎPictureBox¤WÅã¥Ü¹Ï¤¸ Dim g As Graphics '³]©wBitMap ¤j¤p¦pPictureBox1 ¤Ø¤o150, 150) Dim bmp As New Bitmap(PictureBox1.Width, PictureBox1.Height Dim bmp2 As New Bitmap(PictureBox1.Width, PictureBox1.Height) g = Graphics.FromImage(bmp) '³]©wGraphicsª«¥ó¥Hbmp ¬°µe¥¬ ,§Y¦bbmp¤Wµe¹Ï g.FillRectangle(New SolidBrush(Color.Red), 0, 0, 120, 120) 'µe¬õ¦â¹ê¤ß¯x§Î¤è®Ø g.DrawRectangle(Pens.Red, 0, 0, 120, 120) Dim ptColor As Color 'ptColor = bmp.GetPixel(40, 40) 'GetPixel¤èªk¥²¶·¦bBitmap¤W¾Þ§@ 'MsgBox("col= " & ptColor.ToString) PictureBox1.Image = bmp '¦bPictureBox1¤WÅã¥Ü¦bbmp¹Ï¤¸ 'MsgBox("vartype(color.red)= " & VarType(Color)) For i As Integer = 0 To PictureBox1.Width - 1 For j As Integer = 0 To PictureBox1.Height - 1 ptColor = bmp.GetPixel(i, j) 'ÃC¦â¤¬¾l«áRGB(0,255,255) Dim setcolor As Color = Color.FromArgb(255, 255 - ptColor.R, 255 - ptColor.G, 255 - ptColor.B) If i = 10 And j = 10 Then MsgBox("color=" & setcolor.ToString) bmp2.SetPixel(i, j, setcolor) Next Next PictureBox2.Visible = True PictureBox2.Image = bmp2 g.Dispose()
¤U±ªº¤ù¬qµ{¦¡½X¬°¦bForm©ÎPictureBox¤W§Q¥ÎApi¨ç¼Æ¡Aª½±µÂ^¨ú¹³¯À¤Î§G³]¹³¯Àªº§@·~¤è¦¡¡C
Private Shared Function GetDC(ByVal hwnd As IntPtr) As IntPtr End Function
Private Declare Function GetPixel Lib "gdi32" Alias "GetPixel" (ByVal hdc As IntPtr, ByVal X As Int32, ByVal Y As Int32) As Int32 Private Declare Function SetPixel Lib "gdi32" Alias "SetPixel" (ByVal hdc As IntPtr, ByVal X As Int32, ByVal Y As Int32, ByVal crColor As Int32) As Int32 Private Shared Function ReleaseDC(ByVal hWnd As IntPtr, ByVal hDC As IntPtr) As Integer Dim lngPtcolor As Long
Dim gp1 As Graphics = PictureBox1.CreateGraphics Dim hdc1 As IntPtr = gp1.GetHdc() Dim lngsetcolor As Integer For i As Integer = 0 To PictureBox1.Width - 1 For j As Integer = 0 To PictureBox1.Height - 1 lngPtcolor = GetPixel(hdc1, i, j) SetPixel(hdc1, i, j, lngPtcolor) Next j Next i ReleaseDC(IntPtr.Zero, hdc1) '±NDC ÄÀ©ñ End sub 21.5.4¶i¶¥¼v¹³³B²z ¼v¹³³B²z¥i·§¤À¬°(a)ÂI¹³¯À³B²z(Point processes)¡A¤Î(b)±¹³¯À³B²z(Area processes)¨â¤jÃþ¡CÂI¹³¯À³B²z¡A²³æ»¡´N¬O¥u³B²z¹³¯ÀÂI¦Û¨ªºÃC¦â¸ê°T¤£¯A¤Î¨ä¥L¹³¯ÀÂIªºÃC¦â¸ê°T¡F¬Û¤Ï¦a¡A±¹³¯À³B²z«h¨ä¹³¯ÀÃC¦â¨ü¨ä¾Fªñ¨ä¥L¹³¯À¼vÅT¦Ó§ïÅÜÃC¦âÈ¡C¦³Ãö(1)¼v¹³ÃC¦â¦Ç¶¥(Gray scale)¡B(2)ÃC¦â¤¬¸É(¾l¡AComplement)¡B(3)ÃC¦â«G«×(Brightness)¡B(4)ÃC¦â¥¿Å(Balance)¡B(5)ÃC¦â¹ï¤ñ(Contrast)¡B(6)¼v¹³¬Û´î(Image substract)¡B(7)¼v¹³¥§¡(Image averaging)¡B(8)¼v¹³²Õ¦X(Image composing)¡B(9)¼v¹³±ÛÂà(Image rotation)¡B(10)¼v¹³¤Ï®g(Image reflection)¡B(11)¼v¹³¦ùÁY(Image resize)µ¥¡A¦hÄÝÂI¹³¯À³B²z½d³ò¡C¦Ü©ó¹³¯ÀªÅ¶¡Âo¥ú(Spatial filtering)¤¤½Ñ¦p©Ò¿×(1)§C«×Âo¥ú(Low-pass filters¡A³B²z«á¼v¹³¤ñì¨Ó¼Ò½k¡BÂaÄg)³B²z¡B(2)°ª«×Âo¥ú(High-pass filters³B²z«á¼v¹³¤ñì¨Ó¦y¾U¡B¦³¼h¦¸)³B²z¡B(3)¼v¹³Ãä½t°»´ú(Prewitt gradient edge detection¤ÎLaplacian edge diction)µ¥¦hÄݱ¹³¯À³B²z¡C ¤Wz¦U¶µ§@·~¦h¥]§t(a)Ū¨ú¹³¯À¸ê®Æ¡A(b)¹³¯ÀÃC¦â¸ê®Æ¹Bºâ¡A(c)±N³B²z¹L«áÃC¦â¸ê®Æ¼g¦^ì¼v¹³ÀɮסA(d)Åã¥Ü·s¼v¹³¡Aµ¥¥|Ó¥Dn¨BÆJ¡CVB NETÁö´£¨Ñ¦³GetPixel()¤ÎSetPixel()¤§¹³¯À³B²z¤èªk¡A¨ä³B²z¤p¹Ï´T¼v¹³¬O«Üª½±µ¡B¤è«K¡A¦ý¦pn³B²z¸û¤j¹Ï´T¼v¹³´NÅã±o¦³¨Ç¤O¤£±q¤ß¡Cn³B²z¹Ï¹³¤§¹Bºâ³t«×§Ö¡A«h¦ì¤¸¸ê®Æ¤§¹Bºâ¡A´N¥²¶·±Ä¥Î«e±©Ò¤¶²Ð¤§Bitmap¸ê®ÆÅª¼g¤Î¹BºâÆ[©À¡A¶i¤J°O¾ÐÅ餤ª½±µ¾Þ§@¡CVB NET`´£¨Ñ¦³°O¾ÐÅé¦ì¤¸Âê©w¤èªk(LockBits method)¡A¥i¥H¦bÂê¦í¦ì¤¸°O¾ÐÅ鱡ªp¤U(¦p¤£Âê¦í¡A«h¹Bºâ®É¦ì¤¸¦ì§}·|ÀH®É§ïÅÜ¡A³y¦¨¿ù»~)Àu¥ý³B²zµ{§Ç¡Aª½±µ¦b°O¾ÐÅé§@¦ì¤¸¹Bºâ¡A§@·~§¹¦¨«á¡A¦A¸Ñ°£Âê©w(UnlockBits)ÄÀ©ñ¸ê·½¡A¨Ñ¨ä¥Lµ{§Ç¨Ï¥Î¡C¤U±§ÚÌ´N¤¶²ÐLockBits»PUnlockBitsªº¥Îªk¡C ' Âê¦íÂI°}¹Ï¸ê®Æ. Public Sub LockBitmap() '³]©w¯x§ÎRectµ²ºcÀx¦s°}¹Ï¸ê®Æ Dim Rect As Rectangle = New Rectangle( _ 0, 0, m_Bitmap.Width, m_Bitmap.Height) ' Âê¦íÂI°}¹Ï°O¾ÐÅé. m_BitmapData = m_Bitmap.LockBits(Rect, _ Imaging.ImageLockMode.ReadWrite, _ Imaging.PixelFormat.Format24bppRgb) RowSizeBytes = m_BitmapData.Stride
' ¦w±Æ¸ê®ÆÀx¦s°}¦CImageBytes(). Dim total_size As Integer = m_BitmapData.Stride * m_BitmapData.Height ReDim ImageBytes(total_size)
' ½Æ»sÂI°}Åé¸ê®Æ¦Ü°}¦CImageBytes(). Marshal.Copy(m_BitmapData.Scan0, ImageBytes, _ 0, total_size) End Sub
' ½Æ»s°}¦C¸ê®Æ¦^ÂI°}¦CÅé¨ÃÄÀ©ñ¸ê·½ ' Public Sub UnlockBitmap() ' ½Æ»s°}¦C¸ê®Æ¦^ÂI°}¦C. Dim total_size As Integer = m_BitmapData.Stride * m_BitmapData.Height Marshal.Copy(ImageBytes, 0, _ m_BitmapData.Scan0, total_size)
' ¸Ñ°£Âê©w. m_Bitmap.UnlockBits(m_BitmapData)
' ÄÀ©ñ¸ê·½. ImageBytes = Nothing m_BitmapData = Nothing End Sub ¤U±¬°§Q¥ÎVB NET©Ò´£¨Ñ¤§BitmapDataÃþ§O¡A©Ò½s¼g¼v¹³ÃC¦â¤¬¸É(¾l)¤§µ{§Ç½X¡A¦¹³¡¥÷»P«e±©Ò¤¶²Ð¤§ÂI°}¹Ï¸ê®ÆÅª¼g¬Û·íÃþ¦ü¡CÂI°}¹Ï¸ê®Æ¦b°O¾ÐÅ餤Àx¦s¤è¦¡¬O¤@ºû«×¡A¦Ó¿Ã¹õ¹Ï¹³Åã¥Ü¬O¤Gºû«×¡C Public Function ImgComplement1D(ByVal Canvas As PictureBox) As Image Dim start_time As Date = Now Dim R As Byte, G As Byte, B As Byte Dim Width As Integer, Height As Integer Dim mBitmap As Bitmap
If OpenFileDialog1.ShowDialog = DialogResult.OK Then Try picOrg.Image = New Bitmap(OpenFileDialog1.FileName) mBitmap = New Bitmap(picOrg.Image)e) Width = mBitmap.Width '¤£n¨Ï¥ÎCanvas.Width Height = mBitmap.Height '¤£n¨Ï¥ÎCanvas.Height Dim rect As New Rectangle(0, 0, Width, Height) '¥Hrect°Ï°ìÀx¦sBitmapData¸ê®Æ Dim bmpData As BitmapData = mBitmap.LockBits(rect, ImageLockMode.ReadWrite, mBitmap.PixelFormat) Dim ptr As IntPtr = bmpData.Scan0 '±o¨ì²Ä¤@Ó¹³¯Àªº«ü¼Ð¦ì¸m Dim bytes As Integer = bmpData.Stride * Height ListBox1.Items.Add("picbox.width= " & Canvas.Width) ListBox1.Items.Add("picbox.height= " & Canvas.Height) ListBox1.Items.Add("°O¾ÐÅé«ü¼Ð¦ì¸mhex(scan0 )= " & Hex(CInt(bmpData.Scan0))) With bmpData ListBox1.Items.Add("bmpdata--------------") ListBox1.Items.Add(".Stride= " & .Stride) 'bmpData.Stride ª«¥ó¤À´²¼e«×(±½ºË½u¼e«×) ListBox1.Items.Add(".width= " & .Width) 'bmpData.Width ¹³¯À¼e«×(ÂI°}¹Ï¹³¯À¼e«×) ListBox1.Items.Add(".height= " & .Height) 'bmpData.Height ¹³¯À°ª«×(ÂI°}¹Ï¹³¯À°ª«×) ListBox1.Items.Add("hex(.PixelFormat)= " & Hex(.PixelFormat)) 'bmpData.PixelFormat ¹³¯À¸ê°T®æ¦¡ ListBox1.Items.Add("Totalbytes = " & bytes) ListBox1.Items.Add("mBitmap.width= " & mBitmap.Width) ListBox1.Items.Add("mBitmap.height= " & mBitmap.Height) ListBox1.Items.Add("mBitmap.HorizontalResolution= " & mBitmap.HorizontalResolution) ListBox1.Items.Add("mBitmap.VerticalResolution= " & mBitmap.VerticalResolution) ListBox1.Items.Add("dpp=(bmpData.Stride \ mBitmap.Width)= " & bmpData.Stride \ mBitmap.Width) ListBox1.Items.Add("JunkByte=(stride-dpp*mBitmap.width= " & (bmpData.Stride - (bmpData.Stride \ mBitmap.Width) * mBitmap.Width)) ListBox1.Items.Add("bmpdata--------------") End With Dim Bpx As Byte = bmpData.Stride \ mBitmap.Width '¨C¤@¹³¯Àªº¦ì¤¸²Õ¼Æ(3©Î4) '¦ì¤¸¹Bºâ Dim st As String ¡¥*************************************************************************** ¡¥*************************************************************************** Dim rgbValues(bytes - 1) As Byte Marshal.Copy(ptr, rgbValues, 0, bytes) '±N°O¾ÐÅé¶ô½Æ»s¨ì°}¦C¡A³o¬O¥»µ{§ÇÃöÁä '¦ì¤¸¹Bºâ结§ô Dim rgbA As Byte
For k As Integer = 0 To rgbValues.Length - Bpx Step Bpx '¦p»Ýn¼g¥X°O¾ÐÅé¸ê®Æ,¥i¨Ï¥Î¤U¦C¥|¦æ³¯z¥y '?st = "" '? st = st & Hex(rgbValues(k)) & " " & Hex(rgbValues(k + 1)) & " " & Hex(rgbValues(k + 2)) '?If Bpx = 4 Then st = st & " " & Hex(rgbValues(k + 3)) '?ListBox1.Items.Add(st)
B = CByte(255 - rgbValues(k)) G = CByte(255 - rgbValues(k + 1)) R = CByte(255 - rgbValues(k + 2)) rgbValues(k) = B rgbValues(k + 1) = G rgbValues(k + 2) = R If Bpx = 4 Then rgbA = rgbValues(k + 3) End If Next ¡¥¡¥*************************************************************************** ¡¥*************************************************************************** '¦ì¤¸¹Bºâ结§ô '±N°}¦C½Æ»s¨ì°O¾ÐÅé¶ô Marshal.Copy(rgbValues, 0, ptr, bytes) '
mBitmap.UnlockBits(bmpData) Dim elapsed_time As TimeSpan = Now.Subtract(start_time) 'Lbltime.Text = elapsed_time.TotalSeconds.ToString("0.0000")
Catch ex As SystemException MsgBox(ex.Message, MsgBoxStyle.Critical) End Try
End If
Return mBitmap End Function ¤Wzµ{¦¡½X¡A¹³¯ÀÃC¦â¦ì¤¸¬O¤@ºû«×¡C¦pn§ï¦¨¤Gºû«×¡A©Î¤Tºû«×¥u»Ý±N¨â¦æ¬P¸¹(¡¨*¡¨)©Ò¥]§¨³¡¥÷§ó§ï¬°¡G ¡¥¡¥*************************************************************************** ¡¥***************************************************************************
Dim rgbBVals(bmpData.Width - 1, bmpData.Height - 1), rgbGVals(bmpData.Width - 1, bmpData.Height - 1), rgbRVals(bmpData.Width - 1, bmpData.Height - 1) Dim rgbAVals(bmpData.Width - 1, bmpData.Height - 1)
For y As Integer = 0 To bmpData.Height - 1 pix = y * bmpData.Stride For x As Integer = 0 To bmpData.Width - 1 ' Blue component. rgbVals1D(pix) = CByte(255) - rgbVals1D(pix) rgbBVals(x, y) = rgbVals1D(pix) pix += 1 ' Green component. rgbVals1D(pix) = CByte(255) - rgbVals1D(pix) rgbGVals(x, y) = rgbVals1D(pix) pix += 1 ' Red component. rgbVals1D(pix) = CByte(255) - rgbVals1D(pix) rgbRVals(x, y) = rgbVals1D(pix) pix += 1 ' Reserved If Bpx = 4 Then 'ListBox1.Items.Add("rgb.reserved : " & Hex(rgbVals1D(pix))) rgbVals1D(pix) = rgbVals1D(pix) rgbAVals(x, y) = rgbVals1D(pix) pix += 1 End If Next x Next y ¡¥¡¥*************************************************************************** ¡¥*************************************************************************** Dim rgbVals3D(3, bmpData.Width - 1, bmpData.Height - 1) As Byte
For y As Integer = 0 To bmpData.Height - 1 pix = y * bmpData.Stride For x As Integer = 0 To bmpData.Width - 1 'If (x = bmpData.Width - 1) Then ListBox1.Items.Add("X,Y,V)" & x & ";" & y & ";" & rgbVals1D(pix)) ' Blue component. rgbVals1D(pix) = CByte(255) - rgbVals1D(pix) rgbVals3D(0, x, y) = rgbVals1D(pix) pix += 1 ' Green component. rgbVals1D(pix) = CByte(255) - rgbVals1D(pix) rgbVals3D(1, x, y) = rgbVals1D(pix) pix += 1 ' Red component. rgbVals1D(pix) = CByte(255) - rgbVals1D(pix) rgbVals3D(2, x, y) = rgbVals1D(pix) pix += 1 ' Reserved rgbVals1D(pix) = rgbVals1D(pix) rgbVals3D(3, x, y) = rgbVals1D(pix) pix += 1 Next x Next y
¤Wz¦ì¤¸¹Bºâ³t«×¤´µM¥H1D³t«×³Ì§Ö¡A2D»P3D«h³t«×®t§O¤£¤j¡C¦³Ãö¨ä¥L¼v¹³³B²z¡A½Ñ¦p¦Ç¶¥(Grayscale)¡B«G«×(Brightness)¡B¥¿Å(Balance)µ¥µ{¦¡½X¤§½s¼g¡A¥i°Ñ¥»®Ñ¥úºÐ¬ÛÃöµ{¦¡½X¡A©ÎRod Stephens ©ÒµÛ¤§Visual Basic(VB 6.0ª©) Grapics Programming®ÑÄy¡C¤U±§Ú̦A¤¶²Ð´XÓ¼v¹³³B²z¤ñ¸û¦³½ì¤§°ÝÃD¡G(1)¼v¹³¬Û´î¡A(2)¼v¹³¥§¡¡A(3)¼v¹³²Õ¦X¡A(4)Ãä½t°»´ú(Edge Detection)¤§°ò¥»ÃöÆ[©À¡C
¼v¹³¬Û´î¡G ¼v¹³¬Û´î¥Dn¬O§Q¥Î¼v¹³¦V¥ª¡B©Î(¤Î)¦V¥k¡B©Î(¤Î)¦V¤W¡B©Î(¤Î)¦V¤U²¾°ÊY¤z¹³¯ÀÂI«á»Pì¼v¹³¬Û¦P¦ì¸mÃC¦âȬ۴î¡A«hÃC¦âȬۦPªÌ¡A«h¨äÃC¦âȵ¥©ó0©Î±µªñ0¡F¦Óª«ÅéÃä½tªþªñ¡A¬Û´î«áÃC¦âȵ´¹ïȤj¡A¦]¦¹³y¦¨¤Ï®t®ÄªG¡C
'¦ì¤¸¾Þ§@ For y As Integer = 1 To bmpData.Height - 2 For x As Integer = 1 To bmpData.Width - 2 Rr = 0 Gg = 0 Bb = 0 For i As Integer = -1 To 1 For j As Integer = -1 To 1 Bb = Bb + Math.Abs(CInt(rgbBVals(x + i, y + j)) - CInt(rgbBVals(x, y))) Gg = Gg + Math.Abs(CInt(rgbGVals(x + i, y + j)) - CInt(rgbGVals(x, y))) Rr = Rr + Math.Abs(CInt(rgbRVals(x + i, y + j)) - CInt(rgbRVals(x, y))) Next j Next i If Rr < 0 Then Rr = 0 If Rr > 255 Then Rr = 255 If Gg < 0 Then Gg = 0 If Gg > 255 Then Gg = 255 If Bb < 0 Then Bb = 0 If Bb > 255 Then Bb = 255
rgbRValsNew(x, y) = CByte(Rr) rgbGValsNew(x, y) = CByte(Gg) rgbBValsNew(x, y) = CByte(Bb) If Bpx = 4 Then rgbAValsNew(x, y) = rgbAVals(x, y) End If
Next x Next y
¼v¹³¥§¡¡G ¼v¹³¥§¡¥Dn¬O¦b®ø°£©Î´î¤Ö¹Ï¹³¤§ÃC¦â¿ùÂø(Noise)²{¶H¡A¨ä«Y§Q¥Î¦P¤@³õ´º¤§¦h´T¼v¹³¡A¨D¨äÃC¦â¥§¡È¡Cµ{§Ç½X¼gªk»PÂI³B²z¤§ÃC¦â¦Ç¶¥³B²z¬Û·íÃþ¦ü¡A®t§O¦b¤@Ó¬O³æ´T¼v¹³ÂIR¡BG¡BB¤TºØÃC¦âºî¦X¥§¡¡F¤@Ó¬O¦h´T¼v¹³ÂIR¡BG¡BB¤TÃC¦â¦U§O¥§¡¡C
¼v¹³²Õ¦X¡G ¼v¹³²Õ¦X¥Dn¬O±N¨â´T¤£¦Pªº¼v¹³¡A¦U¨ú¤@³¡¥÷«á²Õ¦X¦Ó¦¨ªº¡C¼v¹³²Õ¦X¤§«ÂI¡A¬O¦p¦ó¦³®Ä®ø°£«e´º¼v¹³Ãä½tªº¹³¯À¡A¾¨¶q¨Ï¨ä¼Ò½k¡AÅý²Õ¦X«á¼v¹³¨âªÌ¦X¬°¤@¡C¤U±¬O¼v¹³²Õ¦Xªº¤ù¬qµ{¦¡½X¡C
'«e´º¹Ï¼v¹³ For Y = 1 To frbmpData.Height - 2 For X = 1 To frbmpData.Width - 2 ' ½T»{¾B¸n¹³¯ÀÃC¦â¬O§_³z©úSee if the mask pixel is transparent. is_transparent = ( _ (frrgbRVals(X, Y) = transparent_r) And _ (frrgbGVals(X, Y) = transparent_g) And _ (frrgbBVals(X, Y) = transparent_b))
If is_transparent Then ' The foreground pixel's transparent. ' Just use the background pixel color. '¦pªG"¬O"«h¨Ï¥ÎI´º¹³¯ÀÃC¦â rtrgbRVals(X, Y) = bkrgbRVals(X, Y) rtrgbGVals(X, Y) = bkrgbGVals(X, Y) rtrgbBVals(X, Y) = bkrgbBVals(X, Y) If frBpx = 4 And bkBpx = 4 Then rtrgbAVals(X, Y) = bkrgbAVals(X, Y) End If
Else ' Use a weighted average of the ' foreground and background pixels.
' See how many adjacent pixels are transparent. '¦pªG"¤£¬O"«h¨Ï¥ÎI´º¤Î«e´º¹³¯ÀÃC¦â¥§¡È num_transparent = 0 For i = -1 To 1 For j = -1 To 1 If (frrgbRVals(X + i, Y + j) = transparent_r) And _ (frrgbGVals(X + i, Y + j) = transparent_g) And _ (frrgbBVals(X + i, Y + j) = transparent_b) _ Then num_transparent = num_transparent + 1 End If Next j Next i
' ¿ï¨úÃC¦âPick the color. background_fraction = num_transparent / 9.0# foreground_fraction = 1.0# - background_fraction 'With result_pixels(X, Y) rtrgbRVals(X, Y) = foreground_fraction * frrgbRVals(X, Y) + _ background_fraction * bkrgbRVals(X, Y) rtrgbGVals(X, Y) = foreground_fraction * frrgbGVals(X, Y) + _ background_fraction * bkrgbGVals(X, Y) rtrgbBVals(X, Y) = foreground_fraction * frrgbBVals(X, Y) + _ background_fraction * bkrgbBVals(X, Y) If frBpx = 4 And bkBpx = 4 Then rtrgbAVals(X, Y) = frrgbAVals(X, Y) End If 'End With End If Next X Next Y
' ½Æ»sI´ºÃä½t¹³¯ÀCopy the background edge pixels. For Y = 0 To frbmpData.Height - 1 'PicForeground.ScaleHeight - 1 rtrgbRVals(0, Y) = bkrgbRVals(0, Y) rtrgbGVals(0, Y) = bkrgbGVals(0, Y) rtrgbBVals(0, Y) = bkrgbBVals(0, Y) rtrgbRVals(frbmpData.Width - 1, Y) = bkrgbRVals(frbmpData.Width - 1, Y) rtrgbGVals(frbmpData.Width - 1, Y) = bkrgbGVals(frbmpData.Width - 1, Y) rtrgbBVals(frbmpData.Width - 1, Y) = bkrgbBVals(frbmpData.Width - 1, Y) If frBpx = 4 And bkBpx = 4 Then rtrgbAVals(0, Y) = bkrgbAVals(0, Y) rtrgbAVals(frbmpData.Width - 1, Y) = bkrgbAVals(frbmpData.Width - 1, Y) End If Next Y For X = 0 To frbmpData.Width - 1 rtrgbRVals(X, 0) = bkrgbRVals(X, 0) rtrgbGVals(X, 0) = bkrgbGVals(X, 0) rtrgbBVals(X, 0) = bkrgbBVals(X, 0) rtrgbRVals(X, frbmpData.Height - 1) = bkrgbRVals(X, frbmpData.Height - 1) rtrgbGVals(X, frbmpData.Height - 1) = bkrgbGVals(X, frbmpData.Height - 1) rtrgbBVals(X, frbmpData.Height - 1) = bkrgbBVals(X, frbmpData.Height - 1) If frBpx = 4 And bkBpx = 4 Then rtrgbAVals(X, 0) = bkrgbAVals(X, 0) rtrgbAVals(X, frbmpData.Height - 1) = bkrgbAVals(X, frbmpData.Height - 1) End If Next X
ªÅ¶¡Âo¥ú¡G ªÅ¶¡Âo¥ú¥Dn¬O¥H¹³¯ÀÂI¬°¤¤¤ß¡A¨D¨ä©P³ò¤è§Î¹³¯ÀÂIÃC¦âªºÅv«¥§¡È¡C¤@¯ë¤è§Î¹³¯ÀÂIÃC¦âªºÅv«¤j¤p¡A¦h¥H°}¦C(¦pKernel())¨Óªí¥Ü¡C¦p¤U±¤§Kernel()¬°Åv ȧ¡µ¥ªÌ¡C
¨Ï¥Î¤£¦P¤§Kernel°}¦CȹBºâ¡A·|²£¥Í¤£¦Pªº¼v¹³¦¨ªG¡C¦p¤U±¤§Kernel°}¦C¬°§C«×Âo¥ú(Low-pass filters)
¦Ó
«hÄݰª«×Âo¥ú(High-pass filters)ªÌ¡C¨âªÌÅv«Á`©M§¡¬°1¡A¦ý®ÄªG§¹¥þ¤£¦P¡C«eªÌ¦U¬Û¾F¤§¹³¯ÀÂI»P¤¤¤ßÂIÃC¦âÅvȧ¡¬°¥¿¡A¥BÅvÈ®t¤p1¡F«áªÌ«h°£¤¤¤ßÂI¬°¥¿¥~¡AÅvȧ¡¬°t¡AÅvÈ®tµ´¹ïÈ»·¤j©ó1¡C¤U±¨â±i¹Ï¤ù¬°§Q¥ÎÂo¥ú³B²z«á¤§·Ó¤ù¡A¤W¤@±i¬°§C«×Âo¥ú¡A¬Ý°_¨Ó¤ñ¸û¼Ò½k¡F¤U¤@±i¬°°ª«×Âo¥ú¡A¬Ý°_¨Ó¤ñ¸û²M²M·¡¡B¦y¾U¡C
Ãä½t°»´ú¡G Prewittº¥ÅÜ«¬Ãä½t°»´ú§Q¥Î¯S©w¤è¦V(¦p¥ÑªF«n¦Ü¦è¥_¡A©Î¥ÑªF¦Ü¦è)¡A»Ýn°»´ú¤è¦V¤§Kernel()ÅvȬ°¥¿¡A¥t¤@ºÝ¬°t¡CLapalcianÃä½t°»´ú«h¨Ï¥Î¹ïºÙ«¬Kernel()ÅvÈ¡C¤U¨â±i¹Ï¤¤¡A¤W±¬°Prewittº¥ÅÜ«¬Ãä½t°»´ú(ªF¦Ü¦è)¡A¤U±¤@±i¬°LapalcianÃä½t°»´ú«á¦¨ªG¼v¹³¡C¦³Ãö¨ä¥LÂo¥ú³B²z¤§µ{¦¡½X½s¼g¡A½Ð°Ñ¦Ò¥»®ÑªþÃØ¥ú¿Ò¡C
¦b¤U±§ÚÌ¥t¤¶²Ð¦³Ãö¼v¹³ÅܧΡA½Ñ¦p(1)³½²´(Fish eye)¡A(2)§á¦±(Twist)¡A(3)¤W³¡ÁY¤p(Small top)¡A(4)į°Ê(Wiggle)¡A(5)ªi®ö(Wave)¡A(6)Á÷ªi®ö(Double wave) µ¥¯S®í®ÄªG³B²z¡C¯S®Ä³B²z«Y§Q¥Î½u©ÊÂà´«¤§§Þ¥©¡A±N¿é¤J¤§¹³¯À¸ê®Æ®y¼Ð¸g¹LÂà´««á¡A¥HÂà´««á¤Ï±À¨Dì¿é¤J®y¼Ð¡C¥H¤U±¤§Âà´«¤èµ{¦¡¬°¨Ò¡AÂà´««áxȤ£ÅÜ¡Ay®y¼ÐÂà´««á¬°ì®y¼Ð¥[( 10 * (Sin(ix_in/ 50 * PI) + 1) + 5)¡C¦¹³B( 10 * (Sin(ix_in/ 50 * PI) + 1) + 5)¬°¥¿©¶¦±½u¡C ix_out= x_in iy_out =y_in +(10 * (Sin(ix_in/ 50 * PI) + 1) + 5) ¸Ñx_in¡Ay_in«á±o¡G x_in = ix_out y_in = iy_out - 10 * (Sin(ix_out / 50 * PI) + 1) + 5 ¦¹Âà´«¤èµ{¦¡´N¥i§@¬°ì¹Ï¹³¥¿©¶¦±½u(ªi®ö§Î¦±½u)¯S®Ä³B²z¤§°ò·Ç¤èµ{¦¡¡C¹Ï§Î¹³¯À¦]Âà´«©Ò³y¦¨¤§¶¡»ØªÅ¥Õ¹³¯À¡A«h¥H¤º´¡ªk¶ñ¸É¡C
¼v¹³±ÛÂà¡G ¼v¹³±ÛÂà¥Dn¬O¦bŪ¨ú¼v¹³¸ê®Æ«á¡A±N¦U¹³¯ÀÂI®y¼Ð¥H¼v¹³¤¤¤ß§@±ÛÂàÂà´«¡AµM«á¥Ñ±ÛÂà®y¼Ðpºâ¥X¦UÂI¤§ÃC¦âÈ¡A¦p±ÛÂà«á®y¼ÐÂI¶W¥X즳¼v¹³¬É¡A«h±N¨ä³]©w¬°¥Õ¦â©Î즳¼v¹³¤§I´º¦â¡C¤U±¬°¼v¹³±ÛÂध¤ù¨èµ{¦¡½X¡G
For iyInput = 0 To bmpData.Height - 1 For ixInput = 0 To bmpData.Width ¡V 1 ' pºâ±ÛÂà«á¹³¯À®y¼Ð dx = ixInput - CxOut dy = iyInput - CyOut radius = Sqrt(dx * dx + dy * dy) theta = Atan2(dy, dx) xOutput = CxIn + radius * Cos(theta + angle * 3.14159 / 180) yOutput = CyIn + radius * Sin(theta + angle * 3.14159 / 180) ixOutput = Int(xOutput) iyOutput = Int(yOutput) ' pºâ¬O§_¶W¥X¬É If (ixOutput >= 0) And (ixOutput < xmaxOutput) And _ (iyOutput >= 0) And (iyOutput < ymaxOutput) _ Then 'pºâ¬É¤º¹³¯ÀÃC¦âÈ dx1 = xOutput - ixOutput dy1 = yOutput - iyOutput dx2 = 1.0# - dx1 dy2 = 1.0# - dy1 ' '¬õ¦â¦¨¥÷ v11 = inputRgbRvals(ixOutput, iyOutput) v12 = inputRgbRvals(ixOutput, iyOutput + 1) v21 = inputRgbRvals(ixOutput + 1, iyOutput) v22 = inputRgbRvals(ixOutput + 1, iyOutput + 1) tpt = v11 * dx2 * dy2 + v12 * dx2 * dy1 + _ v21 * dx1 * dy2 + v22 * dx1 * dy1 If tpt >= 255 Then tpt = 255 If tpt <= 0 Then tpt = 0 outputRgbRvals(ixInput, iyInput) = CByte(tpt) 'ºñ¦â¦¨¥÷ v11 = inputRgbGvals(ixOutput, iyOutput) v12 = inputRgbGvals(ixOutput, iyOutput + 1) v21 = inputRgbGvals(ixOutput + 1, iyOutput) v22 = inputRgbGvals(ixOutput + 1, iyOutput + 1) tpt = v11 * dx2 * dy2 + v12 * dx2 * dy1 + _ v21 * dx1 * dy2 + v22 * dx1 * dy1 If tpt >= 255 Then tpt = 255 If tpt <= 0 Then tpt = 0 outputRgbGvals(ixInput, iyInput) = CByte(tpt) 'Äx¦â¦¨¥÷ v11 = inputRgbBvals(ixOutput, iyOutput) v12 = inputRgbBvals(ixOutput, iyOutput + 1) v21 = inputRgbBvals(ixOutput + 1, iyOutput) v22 = inputRgbBvals(ixOutput + 1, iyOutput + 1) tpt = v11 * dx2 * dy2 + v12 * dx2 * dy1 + _ v21 * dx1 * dy2 + v22 * dx1 * dy1 If tpt >= 255 Then tpt = 255 If tpt <= 0 Then tpt = 0 outputRgbBvals(ixInput, iyInput) = CByte(tpt) If bpx = 4 Then outputRgbAvals(ixInput, iyInput) = 255 End If Else '¬É¥~³]©w¬°¥Õ¦â©ÎI´º¦â outputRgbRvals(ixInput, iyInput) = whiteRgbRVals outputRgbGvals(ixInput, iyInput) = whiteRgbGVals outputRgbBvals(ixInput, iyInput) = whiteRgbBVals If bpx = 4 Then outputRgbAvals(ixInput, iyInput) = whiteRgbAVals End If End If Next ixInput Next iyInput ¼v¹³¤Ï®g¡G ¼v¹³¤Ï®g¥Dn¬O¦bŪ¨ú¼v¹³¸ê®Æ«á¡A±N¦U¹³¯ÀÂI®y¼Ð¨Ì¥H¥ô·Nª½½u¬°°ò·Ç§@¤Ï(Ãè)®gÂà´«¡AµM«á¥Ñ¤Ï®g®y¼Ðpºâ¥X¦UÂI¤§ÃC¦âÈ¡A¦p¤Ï®g«á®y¼ÐÂI¶W¥X즳¼v¹³¬É¡A«h±N¨ä³]©w¬°¥Õ¦â©Î즳¼v¹³¤§I´º¦â¡C¦³Ãö¼v¹³¤Ï®g±ÛÂधµ{¦¡½X¦]»P¼v¹³±ÛÂà«D±`¬Û¦ü¡A¦³¿³½ìŪªÌ¡A½Ð°Ñ¾\ªþÃØ¥úºÐ¡C ¼v¹³¦ùÁY¡G ¼v¹³¦ùÁY¥Dn¬O§Q¥Î½Õ¾ã¹Ï§Î¤è¶ôªº¤Ø¤o¤j¤p±N즳¼v¹³©ñ¤j©ÎÁY¤p¡AµM«á§Q¥ÎDrawImage½Æ»s¼v¹³¡C
' ¨ú±o즳¼v¹³ÂI°}¹ÏGet the source Bitmap. Dim tscale As Single = Val(txtResizescale.Text) Dim anti_alias As Boolean = True Dim mbitmap As Bitmap If OpenFileDialog1.ShowDialog = DialogResult.OK Then mbitmap = New Bitmap(OpenFileDialog1.FileName) PicInput.Image = mbitmap End If ' ³]©w¦ùÁY¼v¹³¹Ï§Î¤è¶ô¤Ø¤o¤j¤p Dim wid As Integer = CInt(PicInput.Width * tScale) Dim hgt As Integer = CInt(PicInput.Height * tScale) Dim rBitmap As New Bitmap(wid, hgt) '½Æ»s¼v¹³ Dim gr As Graphics = Graphics.FromImage(rBitmap) If anti_alias Then gr.InterpolationMode = Drawing2D.InterpolationMode.HighQualityBilinear gr.SmoothingMode = Drawing2D.SmoothingMode.AntiAlias gr.DrawImage(mbitmap, 0, 0, wid - 1, hgt - 1) ' Åã¥Ü¼v¹³ PicOutput.Image = rBitmap
§½³¡¹³¯À¾Þ§@: §½³¡¹³¯À¾Þ§@¡A«Y§Q¥Î¦bŪ¨úÂI°}¹Ï¸ê®Æ«á¡AÂ^¨ú³¡¥÷¹³¯ÀÃC¦â¸ê®Æ¡AµM«á°w¹ï¦¹³¡¥÷¹³¯ÀÃC¦â¸ê®Æ§@¹³¯À¹Bºâ(¦p¦Ç¶¥¡B¤¬¸É¡B¥§¡¡B¹ï¤ñ¡B«G«×µ¥³B²z)¡A©Î¥ô·N§Îª¬«õªÅ¡B§½³¡Â^¨ú¤Î°Å¶Kµ¥³B²z¡C¤Wz¹³¯À¹Bºâ¥u»Ý¦b°O¾ÐÅ骽±µ§@·~¡AÁ|¨Ò¨Ó»¡¡A§Ú̧Ʊæ¦b¼v¹³®y¼Ð¦ì¸m(50,50)³B¡A¥b®|30½d³ò¤º§@¦Ç¶¥³B²z¦Ç¶¥¡A«h§Q¥Î¤U±¤§¤ù¬qµ{¦¡½X´N¯à°µ¨ì¡C
For Y = 0 To bmpData.Height - 1 pix = Y * bmpData.Stride For X = 0 To bmpData.Width - 1
' Blue component. If ((CSng(X) - xcen) ^ 2 + (CSng(Y) - ycen) ^ 2 - Rad ^ 2) >= 0.1 Then outputRgbBvals(X, Y) = inputrgbVals1D(pix) Else outputRgbBvals(X, Y) = 255 - inputrgbVals1D(pix) End If pix += 1 ' Green component. If ((CSng(X) - xcen) ^ 2 + (CSng(Y) - ycen) ^ 2 - Rad ^ 2) >= 0.1 Then outputRgbGvals(X, Y) = inputrgbVals1D(pix) Else outputRgbGvals(X, Y) = 255 - inputrgbVals1D(pix) End If pix += 1 ' Red component. If ((CSng(X) - xcen) ^ 2 + (CSng(Y) - ycen) ^ 2 - Rad ^ 2) >= 0.1 Then outputRgbRvals(X, Y) = inputrgbVals1D(pix) Else outputRgbRvals(X, Y) = 255 - inputrgbVals1D(pix) End If pix += 1 ' Reserved If bpx = 4 Then outputRgbAvals(X, Y) = inputrgbVals1D(pix) pix += 1 End If
Next X Next Y End If
¦Ü©ó¥ô·N§Îª¬«õªÅ¡B§½³¡Â^¨ú¤Î°Å©«µ¥³B²z¡A«h¶·±Npµe³B²z¤§½d³ò¤º¹³¯À¸ê ®Æ®y¼Ð¦ì¸m¤ÎÃC¦â¸ê®Æ¡A¥t¥~Àx¦s³Æ¥Î¡CµM«á¦A¹ï¦¹®y¼Ð¦ì¸m¤ÎÃC¦â¸ê®Æ§@¹Bºâ³B²z¡C¤U¹Ï¬°§½³¡Â^¨ú¤Î¦Ç¶¥«á¡A½Æ»s¦Ü¥t¥~¤@ӹϧΤè¶ôªº¦¨ªG¹Ï¥Ü¡C
VB.NET¤¤¥i¨Ï¥ÎGraphicsÃþ§OªºDrawImage§½³¡¤èªkÅã¥Ü¹Ï§ÎÀÉ¡A¦b¤£¦P®É¶¡¶¡¹j¡A¤£¦Pªº¦ì¸mÅã¥Ü¦P¤@¹Ï§ÎÀÉ·|²£¥ÍµøÄ±¤Wªº°Êµe®ÄªG¡CDrawImage¤èªk¥i«ü©w¥ØªºÃ¸¹Ï°Ï¡A¤]¥i«ü©w¨Ó·½¹Ï¤ùªºÅã¥Ü½d³ò¡A¬G¨ã³Æ¦³¦Û°ÊÁY©ñ¥\¯à¡A·|¦Û°Ê±N¹Ï¤ù©ñ¤j©ÎÁY¤p¥H¶ñ¥R«ü©wªº¾ãÓø¹Ï°Ï°ì¡A¤U±¬°30ºØ¤¤¸û¥Î¤§´XºØ»yªk¡G
DrawImage(Imageª«¥ó¡Ax,y) DrawImage(Imageª«¥ó¡APointµ²ºc) DrawImage(Imageª«¥ó¡A¥ØªºRectangleµ²ºc) DrawImage(Imageª«¥ó¡Ax,y¡A¨Ó·½Rectangleµ²ºc¡A¹Ï§Î³æ¦ì) DrawImage(Imageª«¥ó¡A¥ØªºRectangleµ²ºc¡A¨Ó·½Rectangleµ²ºc¡A¹Ï§Î³æ¦ì)
¤U±¬°§Q¥ÎDrawImage¤èªk©Ò»s§@ªºÂ²³æ°Êµe¤pºëÆF¡AÂÇ¥|Ó¦³¤£¦Pªº¶}¤f¾ò¶ê¡A¤GÓ¤p¶ê¥Nªí¤pºëÆF¤f¤¤¤p¦ä¤Î²´·ú¡A§Q¥Îp®É¾¹¨C100²@¬í¥H§ïÅܤpºëÆF¦ì¸m(x.yÈ)²£¥Í°Êµe®ÄªG¡C
'º¥ý¦bForm1Ãþ¤¤©w¸qÅܼơAµ{§Ç¿Â¦p¤U¡C Dim iRepeat As Integer Dim x, y, wid, ht As Integer Dim angBeg(3) As Integer Dim angEnd(3) As Integer Dim gp As Graphics Dim ncount As Integer = 0
'Form1ªºLoad¨Æ¥ó½s¼gµ{§Ç¿Â¡A³]¸mªì©lÈ¡Aµ{§Ç¿Â¦p¤U©Ò¥Ü¡C Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load gp = PicCanvas.CreateGraphics x = PicCanvas.Width - 10 : y = 10 : wid = 55 : ht = 50 '¶}©l®É¤pºëÆF¦ì¸m angBeg(0) = 130 '²Ä¤@ӹϪº°_©l¨¤«× angEnd(0) = -250 '²Ä¤@ӹϪºµ²§ô¨¤«× angBeg(1) = 150 '²Ä¤GӹϪº°_©l¨¤«× angEnd(1) = -280 '²Ä¤TӹϪºµ²§ô¨¤«× angBeg(2) = 180 '²Ä¤TӹϪº°_©l¨¤«× angEnd(2) = -315 '²Ä¤TӹϪºµ²§ô¨¤«× angBeg(3) = 200 '²Ä¥|ӹϪº°_©l¨¤«× angEnd(3) = -350 '²Ä¥|ӹϪºµ²§ô¨¤«× iRepeat = 0 Timer1.Enabled = False End Sub
'¬°Timer±±¨î¶µªºTick¨Æ¥ó½s¼gµ{§Ç½X¡A¦b¤£¦Pªº®É¶¡¶¡¹jùة󤣷|¦ì¸mø»s¤£¦P¯Ê¤fªº®°§Î¡A¨Ã¥B¤@ª½±q¥k©¹¥ª°j°é¹B°Êª½¨ì°±¤î¹B¦æ
Private Sub Timer1_Tick(ByVal sender As Object, ByVal e As System.EventArgs) Handles Timer1.Tick gp.Clear(PicCanvas.BackColor) gp.FillEllipse(Brushes.Red, x + 10, y + 15, 10, 10) '¤pºëÆF¤f¤¤¸¦æ¤p¦ä gp.FillPie(Brushes.Green, x, y, wid, ht, angBeg(iRepeat), angEnd(iRepeat)) gp.FillEllipse(Brushes.White, x + 35, y + 18, 10, 10) '¤pºëÆF²´·ú iRepeat = iRepeat + 1 If iRepeat > 3 Then iRepeat = 0 x = x - 10 'ÅܤƮy¼Ð¦ì¸m y = y + ncount * 2 If x < 10 Then x = PicCanvas.Width - 10 ncount = ncount + 1 End If If y > PicCanvas.Height - 30 Then y = 10 ncount = 0 End If End Sub
21.5.4½u©ÊÂà´« §Ú̦b¥»®Ñ²Ä¤@³¹´N¤¶²Ð¹L½u©Ê¤èµ{²Õ¤Î¯x°}ªºÆ[©À¡A¦p±z¹ï¼Æ¾Ç¤£«ç»ò·P¿³½ì¡A¤]¨SÃö«Y¡C¦bGDI+µ{¦¡¤¤¡A±z¥i¥H§â¥¦·í§@¬O¤@¯ëª«¥ó¡A¥i¥H¹³¨ä¥Lª«¥ó¤@¼Ë¨Ï¥Î¥¦ÌªºÄݩʩM¤èªk¡CVB .NET´£¨Ñ¦³Multiply¡BRotate¡BRotateAt¡BScale¡BShear ©M Translateµ¥¯x°}¤èªk¡CVB .NET¥Î¨Óªí¥Ü¥é®gÂà´«ªº¯x°}²Ä¤TÓ¸ê®Æ¦æ(Column)¥Ã»·¬° (0, 0, 1)¡A¦]¦¹¦b«Ø¥ß Matrix ª«¥ó®É¡A±z¥u»Ýn«ü©w«e¨âÓ¸ê®Æ¦æ¤¤ªº¤»Ó¼Æ¦r¡C¨Ï¥ÎMatrixª«¥ó²Ä¤@¥ó¨Æ´N¬O«Ø¥ßMatrixª«¥ó«á¤è¯à§@½u©ÊÂà´«¡A¦³®ÉÔ¡A¦b¯u¹êªºµ{¦¡¥@¬É¸Ì¡A§ÚÌ¥i¯à»ÝnpºâÂà´«¯x°}¤¤¦U§O¤¸¯À¡C¦p¤U±ªº¤ù¬qµ{¦¡¡G
Dim
myMatrix As Matrix = New Matrix(1, 0, 0, 2, 0, 0)
¡¥¤»Ó¼Æ¦r©Ò¥Nªíªº¯x°}
¡¦«Ø¥ß¤@Óµe¹Ïª«¥ó¡A¤Î¤@Ӷ¦â¯x§Î Dim Rect As Rectangle = New Rectangle(20, 20, 40, 60) Gp.DrawRectangle(Pens.Black, Rect) ¡¦¥HmyMatrix¬°¤Þ¼Æ¡A§@¬°¯x°}¤§½u©ÊÂà´« Gp.MultiplyTransform(myMatrix, MatrixOrder.Append) Gp.DrawRectangle(Pens.Orange, Rect)
§ÚÌ¥²¶·¦A¦Ò¼{®y¼Ð¨t²ÎªºÆ[©À¡A¦bGDI+µe¹Ï§@·~¤¤¡A¥@¬É¨t²Î®y¼Ð(world coordinates)¥²¶·Âà´«¦¨¶±®y¼Ð(page coordinates)¡AµM«áÂà´«¦¨³]³Æ®y¼Ð(device coordinates)¡C¤WzªºMultiplyTransform¯x°}¤èªk¥u¬O¹ïµe¹Ïª«¥ó¶i¦æÂà´«¦Ó«D¹ï¯x§Î§@Âà´«¡C¥t¤@¤è±¡A§ÚÌ¥²¶·¦Ò¼{¨ì¡A¯x°}Âà´«¦¸§Ç¡A¦b¤@¯ë¼Æ¾Ç¹BºâA *B»PB *A¬O¬Ûµ¥ªº¡C¦ý¹ï¯x°}¤§¹Bºâ¡A¦¸§Ç¬O«Ü«n¡A¦p¤U±¤§¹Bºâ
gp.TranslateTransform(-70, 35, MatrixOrder.Append) gp.RotateTransform(30, MatrixOrder.Append) gp.TranslateTransform(186, 75, MatrixOrder.Append) gp.ScaleTransform(2.25F, 0.5F, MatrixOrder.Append)
»P
gp.TranslateTransform(-70, 35, MatrixOrder.Prepend) gp.RotateTransform(30, MatrixOrder.Prepend) gp.TranslateTransform(186, 75, MatrixOrder.Prepend) gp.ScaleTransform(2.25F, 0.5F, MatrixOrder.Prepend)
¯x°}Âà´«¦³©Ò¿×°Ï°ìÂà´«¤Î¥þ°ìÂà´«¨âºØ¡A¥þ°ìÂà´«·|®M¥Î¦Ü¯S©wGraphicsª«¥óø»sªº©Ò¦³¶µ¥Ø¡F¬Û¹ï¦a¡A°Ï°ìÂà´«¥u®M¥Î¦Ünø»sªº¯S©w¶µ¥Ø¡C ¦pªGn«Ø¥ß¥þ°ìÂà´«¡AÀ³¥ý«ØºcGraphicsª«¥ó¡AµM«áºÞ²zTransformÄݩʡCTransform ÄݩʬO¤@Ó Matrix ª«¥ó¡A¦]¦¹¥¦¥i¥H¦s©ñ¥é®gÂà´«ªº¥ô¦ó§Ç¦C¡CÀx¦s¦bTransformÄݩʪºÂà´«¤SºÙ¬°¥þ§½Âà´«¡CGraphicsÃþ§O´£¨Ñ´XÓ¤èªk¡A¥Î¨Ó«Ø¸m½Æ¦Xªº¥þ§½Âà´«¡GMultiplyTransform¡BRotateTransform¡BScaleTransform©MTranslateTransform¡C¤U¦C½d¨Ò·|ø»s¨â¦¸¾ò¶ê§Î¡G¤@¦¸¬O¦b«Ø¥ß¥þ§½Âà´«¤§«e¡A¤@¦¸¬O¦b«Ø¥ß¤§«á¡CÂà´«·|¥ý¦bY¤è¦VÁY©ñ0.75Ó³æ¦ì¡AµM«á¦bX¤è¦V¥²¾40Ó³æ¦ì¡AµM«á¦A±ÛÂà45«×¡C
Dim gp As Graphics = PictureBox1.CreateGraphics '«Ø¥ßµe¹Ïª«¥ó gp.DrawEllipse(myPen, 0, 0, 100, 50) 'µe¾ò¶ê gp.ScaleTransform(1, 0.75F) '¤ñ¨ÒÁY©ñ gp.TranslateTransform(40, 0, MatrixOrder.Append) '¥²¾ gp.RotateTransform(45, MatrixOrder.Append) '±ÛÂà gp.DrawEllipse(myPen, 0, 0, 100, 50) '½u©ÊÂà´««áµe¾ò¶ê
°Ï°ìÂà´«·|®M¥Î¦Ünø»sªº¯S©w¶µ¥Ø¡A¦pGraphicsPathª«¥óªºTransform¤èªk¥i¥Î¨ÓÂà´«¸Ó¸ô®|ªº¸ê®ÆÂI (Data Point)¡C¤U¦C½d¨Òø»s¥¼Âà´«ªº¯x§Î©M¸g¹L±ÛÂà©MÂà´«ªº¸ô®|(°²³]¨S¦³¥þ§½Âà´«)¡C
Dim gp As Graphics = PictureBox1.CreateGraphics '«Ø¥ßµe¹Ïª«¥ó Dim myGraphicsPath As New GraphicsPath '«Ø¥ßµe¹Ï¸ô®| Dim myMatrix As New Matrix() '«Ø¥ß¯x°}ª«¥ó gp.DrawRectangle(Pens.Blue, 50, 50, 100, 150) myGraphicsPath.AddLine(150, 200, 250, 250) gp.DrawPath(Pens.Green, myGraphicsPath) myMatrix.Rotate(30) gp.Transform = myMatrix '¶®y¼ÐìÂI±ÛÂà myGraphicsPath.Transform(myMatrix) 'Æ[¹î¦³µL¥[¥»¦C«á¹Ï§ÎÅÜ¤Æ gp.DrawRectangle(Pens.Red, 50, 50, 100, 150) myGraphicsPath.AddLine(150, 200, 250, 250) gp.DrawPath(Pens.Gray, myGraphicsPath)
±z¥i¥H¨Ï¥Î¥þ§½Âà´«¨Ó§ïÅÜ®y¼Ð¨t²Î¡A¨Ã¥i¨Ï¥Î°Ï°ìÂà´«¨Ó±ÛÂà©MÁY©ñ·s®y¼Ð¨t²Î©Òø»sªºª«¥ó¡C°²³]±z·Qn¨Ï¥Î¤@Ó®y¼Ð¨t²Î¡A¨äìÂI¶ZÂ÷¤u§@°Ï¥ªÃä½t200¹³¯À©M¤u§@°Ï³»ºÝ100¹³¯À³B¡C²{¦b±z·Q¨Ï¥Î¹³¯À°µ¬°«×¶q³æ¦ì¡A¨äx¶b«ü¦V¥k¤è¬°¥¿¡Ay¶b´Â¤W¬°¥¿(¹w³]®y¼Ð¨t²Îªºy¶b´Â¤U)¡A¦]¦¹±z¥²¶·¦b¤ô¥¶b°õ¦æ¤Ï®g¡C¤U±¬°®y¼Ð¤Ï®gªº¯x°}¤ù¬qµ{¦¡½X¡C
Dim gp As Graphics = PictureBox1.CreateGraphics '«Ø¥ßµe¹Ïª«¥ó '¥þ§½Âà´« Dim myMatrix As New Matrix(1, 0, 0, -1, 0, 0) '¤Ï®g¯x°}«Y¼Æ gp.Transform = myMatrix ' gp.TranslateTransform(100, 150, MatrixOrder.Append) '¥²¾ ListBox1.Items.Add("¤Ï®g¤Î¥²¾«á¯x°}«Y¼ÆmyMatrix") For Each TransformElement As Single In gp.Transform.Elements ListBox1.Items.Add(TransformElement) ¡¥¿é¥XÂà´«¯x°}«Y¼Æ Next '«Ø¥ß¸ô®|. Dim myGraphicsPath As New GraphicsPath() Dim myRectangle As New Rectangle(0, 0, 80, 60) myGraphicsPath.AddRectangle(myRectangle) ' ¶ñ¥R¸ô®|(¤Ï®g·s®y¼Ð¨t²Î),µL°Ï°ìÂà´« Dim mySolidBrush = New SolidBrush(Color.Green) gp.FillPath(mySolidBrush, myGraphicsPath) ' ¦bGraphicsPathª«¥ó³]©w°Ï°ìÂà´«. Dim myPathMatrix As New Matrix() myPathMatrix.Scale(2, 1) myPathMatrix.Rotate(30, MatrixOrder.Append) myGraphicsPath.Transform(myPathMatrix) ' ¶ñ¥R¸ô®|(¤Ï®g·s®y¼Ð¨t²Î),¦³°Ï°ìÂà´«. gp.FillPath(New SolidBrush(Color.Blue), myGraphicsPath) gp.Transform.Reset() '½u©ÊÂà´«Âk¹s gp.Dispose() Dim gp1 As Graphics = PictureBox1.CreateGraphics '«Ø¥ßµe¹Ïª«¥ó gp1.TranslateTransform(100, 150, MatrixOrder.Append) '¥²¾ ListBox1.Items.Add("") ListBox1.Items.Add("¶È¥²¾«á¯x°}«Y¼ÆmyMatrix") For Each TransformElement As Single In gp1.Transform.Elements ListBox1.Items.Add(TransformElement) ¡¥¿é¥XÂà´«¯x°}«Y¼Æ Next Dim myGraphicsPath1 As New GraphicsPath() Dim myRectangle1 As New Rectangle(0, 0, 80, 60) myGraphicsPath1.AddRectangle(myRectangle1) ' ¶ñ¥R¸ô®|(µL¤Ï®g,ì®y¼Ð¨t²Î),µL°Ï°ìÂà´« Dim mySolidBrush2 = New SolidBrush(Color.Yellow) gp1.FillPath(mySolidBrush2, myGraphicsPath) '¥¼¤Ï®g gp1.Dispose()
¤U¹Ï¬°°õ¦æ«á¤§¦¨ªGµe±¡A¹Ï¤¤¶À¦â¬°®y¼Ð¥¼§@¤Ï®g¶È¥²¾¤§ì¹Ï§Î¡AÄx¦â³¡¥÷¬°¨Ï¥Î·s®y¼Ð¨t²Î¥B¦³°Ï°ìÂà´«ªÌ¡Fºñ¦â³¡¥÷«h¬°¨Ï¥Î·s®y¼Ð¨t²Î¦ýµL¦³°Ï°ìÂà´«ªÌ¡C
¦pªG»Ýn¼g¥X¯x°}¸ê®Æ¥i¥H¨Ï¥ÎÃþ¦ü¤U¦Cµ{¦¡½X¡G
For Each TransformElement As Single In GraphicObj.Transform.Elements Debug.WriteLine(TransformElement) ¡¥¿é¥XÂà´«¯x°}«Y¼Æ Next
21.6¾ó¥Öµ¬½u»s§@ ¦bVb .0¤Î§ó¦ª©¥»¡Aø»s¾ó¥Öµ¬½u¬O¬Û·í²³æ¤Îª½±µªº¡A±z¥i¥H±NDrawMode³]©wµ¥©ó6(DrawMode=6¡A§YDrawMode=vbInvert)µe¤@±ø½u¡AµM«á¦bì¦ì¸m¦A«µe¤@¦¸´N¥i¥H±Nì¨Óª½½u¶î©Ù±¼¡C¦¹§Q¥Î¤@Ó¹³¯ÀÃC¦â¤§¤Ï¦V¦A¤Ï¦V¬°ì¨ÓÃC¦â¤§Æ[©À¡C°ò©ó¬Y¨Ç²z¥ÑVB .Net¨Ã¨S¦³¤Ï¦V¼Ò¦¡·§©À¡A¦]¦¹µe¾ó¥Öµ¬½u¡A±z»Ýn«Ø¥ß¤@ÓBitmap°}¦C¹Ïª«¥ó(¤@ÓµêÀÀ½w½Ä¼È¦s°Ï)¨Ó¥Nªí¤ÎÀx¦s¹Ï¹³(image)¡C¦bªí³æ(Form)©Î¹Ï§Î¤è¶ô(PicctureBox)¤Wµe½uµM«á¶î©Ù±¼¡A½Æ»sÀx¦s¦bBitmap °}¦C¹Ïª«¥ó¤¤ªº¹Ï¹³¦Üªí³æ(¹Ï§Î¤è¶ô)¤W¡C
MouseDown()µ{§Ç¨Æ¥ó¤¤¡A¨ä¥Dn¤u§@¦³¡G (1)©I¥s°Æµ{¦¡SaveSnapshot(Àx¦s§Ö·Ó)Àx¦sÅܼÆm_X1¡Bm_Y1¡B m_X2¤Îm_Y2ªº¦ì¸m®y¼Ð¡ASaveSnapshot«Ø¥ß¤@Ó·sBitmap°}¦C¹Ï¨Ã¥Î¥¦¨Ó«Ø¥ß¤@ÓªþµÛ©ó¦¹Bitmap¤§µe¹Ïª«¥ó¡C¬°¤FÅýŪªÌ¯àÁA¸Ñ¹q¸£¹ê»Ú¹B§@¤è¦¡¡A¯S§O±N¨ä½s¼g¦¨¤ñ¸ûª½±µ©öÀ´¤è¦¡¡A¨ÃÃB¥~¦w±ÆLblMDxy1¤ÎLblMDxy2¨âÓ¼ÐÅÒ±±¨î¶µ¤À§O°O¿ým_X1¡Bm_Y1¤Î m_X2¡Bm_Y2®y¼Ð¦ì¸mÅܤơC (2)¶}©l³B²zµ{§Ç®É¡A«ö¤U·Æ¹«¥ª¶s®É±Nm_Drawing¥¬ªLȳ]©w¬°¯u(True)¡A¦bm_Drawing=False®É¡A¦Û°Ê¸õ¥XMouseDown¨Æ¥óµ{§Ç¡C¦b¦¹¤]¦w±ÆLbldrawing±±¨î¶µ¥HÆ[¹îm_DrawingÅܤƱ¡ªp¡C (3)Àx¦s¤W¤@¶¥¬q¤w§¹¦¨¤§Â¹Ϥ¸(¦pªG¦³ªº¸Ü)
MouseMove()µ{§Ç¨Æ¥ó¡A¥Dn¥\¯à¬°¡G (1) ·íuser«ö¤U·Æ¹«¥ª¶s¨Ã²¾°Ê·Æ¹«®É¡AÀx¦s²¾°Ê·sÂI®y¼Ðm_X2¡Bm_Y2¦ì¸m¡AMouseMove¨Æ¥óª«¥óÃѧO½X(MouseMove event handler)¡C (2) ©I¥s°Æµ{¦¡DrawForm(©ÎDrawPic)¥H¶î©Ù±¼µe¦bªí³æ(©Î¹Ï§Î¤è¶ô)¤W«eµe¦n¤§ª½½u¶î©Ù±¼ (3) µM«á§Q¥ÎDrawLine¤èªk¦bªí³æ¤W(©Î¹Ï§Î¤è¶ô)µe½u(¤£¬O¦bBitmap¤Wª½±µµe½u)¡A¦]¦¹Bitmap¤W¨ÃµL¦¹ª½½u¡C¤U¤@¦^User²¾°Ê·Æ¹«¡AMouseMove¨Æ¥óª«¥óÃѧO½X©I¥sDrawForm(©ÎDrawPic)¡A«hBitmapÅã¥Ü¨ÃµL¦¹·s½u¡C°Æµ{¦¡DrawForm(©ÎDrawPic)¥u¥ÎDrawImage±N¨äÀx¦s¦bBitmapªº¤wµe¦nªº¹Ï¤¸¦bªí³æ(©Î¹Ï§Î¤è¶ô)¤WÅã¥Ü¡C
MouseUp()µ{§Ç¨Æ¥ó¡A¥Dn¥\¯à¬°¡G
·íUser©ñ¶}·Æ¹«¥ª¶s®É¡A³qª¾¹q¸£m_DrawingÅܧó¬°False¡AMouseUp¨Æ¥óª«¥óÃѧO½X¡AÀx¦sBitmap¤¤³Ì«á¤@±øª½½u(¥HDrawLine¤èªk©Òµe¥XªÌ)¡A¦A©I¥sDrawForm Åã¥Üµe¦³·s½uªºbitmap¡C Pic_Paint()¨Æ¥óµ{§Ç¤¤Pic_Paint event handle¡A¦]¬°VB .NET¨S¦³AutoRedrawÄݩʡA¦]¦¹user·Q¦bªí³æ©Î¹Ï§Î¤è¶ô³Q¥þ³¡©Î³¡¥÷Âл\¦A«ì´_¥XÅS®É¡AUser¥²¶·¦Û¦æ³B²z¡A¦¹Pic_Paint event handler©I¥sDrawPictureBoxÅã¥ÜÀx¦s¦bbitmap¤WÂI°}¹Ï¡C
' µe·s½u®Ém_Drawing ¥¬ªLȬ°¯uTrue Private m_Drawing As Boolean ' ¼È¦s½w½Ä°ÏBuffer¥H©Ù±¼¾ó¥Öµ¬½u. Private m_BufferBitmap As Bitmap '¼È¦s½w½Ä°ÏBitmap Private m_BufferGraphics As Graphics '¼È¦s½w½Ä°Ïµe¹Ïª«¥ó ' ·Æ¹«¦ì¸m®y¼Ð. Private m_X1 As Integer Private m_Y1 As Integer Private m_X2 As Integer Private m_Y2 As Integer 'Àx¦sÀÉ®× Dim Filename As String
'¶}©lµe¾ó¥Öµ¬½u. Private Sub picDraw_MouseDown(ByVal sender As Object, ByVal e _ As System.Windows.Forms.MouseEventArgs) Handles _ PicDraw.MouseDown ' Àx¦s¹Ï§Î¤è¶ô§Ö·Ó SavePicSnapshot() 'Àx¦s§Ö·Ó,µL¦¹³¯z¥y¤£·|¶î©Ù±¼Â¾ó¥Öµ¬½u m_Drawing = True '¶}©lµe¹Ï ' ¦pªG«D¨Ï¥Î¨ì·Æ¹«¥ª¶s´N°h¥X. If e.Button <> MouseButtons.Left Then Exit Sub If e.Button = MouseButtons.Left Then m_Drawing = True '¬Û·í©óm_Drawing = True ' Àx¦s·Æ¹«¥Ø«e¦ì¸m. m_X1 = e.X '¦b picDraw_MouseDown¤¤ª½½u°_²×ÂI«O«ù¤£ÅÜ m_X2 = e.X m_Y1 = e.Y m_Y2 = e.Y LblMDxy1.Text = "x= " & m_X1 & "y= " & m_Y1 '¦h¾l±±¨î¶µ¥i²¾°£ LblMDxy2.Text = "x= " & m_X2 & "y= " & m_Y2 '¦h¾l±±¨î¶µ¥i²¾°£ LblMD_m_Drawing.Text = m_Drawing '¦h¾l±±¨î¶µ¥i²¾°£ End Sub
Private Sub SavePicSnapshot() Dim new_bitmap As Bitmap
' «Ø¥ßµ¥©ó¹Ï§Î¤è¶ô¤Ø¤oªºÂI°}¹Ï. new_bitmap = New Bitmap(PicDraw.Size.Width, PicDraw.Size.Height, _ PicDraw.CreateGraphics()) m_BufferGraphics = Graphics.FromImage(new_bitmap)
' ²M²z·sÂI°}¹Ï. m_BufferGraphics.Clear(PicDraw.BackColor) ' ½Æ»s²{¦sÂI°}¹Ï¤º®e¨ì·sÂI°}¹Ï If Not (m_BufferBitmap Is Nothing) Then m_BufferGraphics.DrawImage(m_BufferBitmap, 0, 0) End If
' Àx¦s·sÂI°}¹Ï¤Îµe¹Ïª«¥ó. m_BufferBitmap = new_bitmap ' PicDraw.Image = new_bitmap '±N½w½Ä°Ï¹ÏÀɼg¤J¹Ï§Î¤è¶ô,¦pµL¦¹«ü¥O,Àx¦s¹ÏÀɦA¸ü¤J®É,¥tø·s¹Ï¤¸®É,¸ü¤J¹Ï¤¸®ø¥¢ End Sub ' Ä~Äòø»s¾ó¥Öµ¬½u. Private Sub picDraw_MouseMove(ByVal sender As Object, ByVal e _ As System.Windows.Forms.MouseEventArgs) Handles _ PicDraw.MouseMove lblxy.Text = " ²{¦b·Æ¹«x = " & e.X & ";y = " & e.Y If m_Drawing = False Then Exit Sub 'm_Drawing=false¸õ¥X If e.Button = MouseButtons.Left Then '¦h¾l«ü¥O ' Àx¦s·sÂI. m_X2 = e.X m_Y2 = e.Y
' ¶î©Ù±¼«e¤@±ø½u. DrawPictureBox(PicDraw.CreateGraphics())
'¦b¹Ï§Î¤è¶ô¤Wª½±µÃ¸»s·s½u PicDraw.CreateGraphics().DrawLine( _ Pens.Gray, m_X1, m_Y1, m_X2, m_Y2) LblMMxy1.Text = "x= " & m_X1 & "y= " & m_Y1 '¦h¾l±±¨î¶µ¥i²¾°£ LblMMxy2.Text = "x= " & m_X2 & "y= " & m_Y2 '¦h¾l±±¨î¶µ¥i²¾°£ LblMM_m_Drawing.Text = m_Drawing '¦h¾l±±¨î¶µ¥i²¾°£ End If '¦h¾l«ü¥O End Sub
'§¹¦¨·sª½½u. Private Sub picDraw_MouseUp(ByVal sender As Object, ByVal e _ As System.Windows.Forms.MouseEventArgs) Handles _ PicDraw.MouseUp 'm_Drawing=Fales°h¥X If m_Drawing = False Then Exit Sub 'm_Drawing=Fales°h¥X If e.Button = Windows.Forms.MouseButtons.Left Then m_Drawing = False 'ÃP¶}¥ª¶s®Ém_Drawing = False; ¬Û·í©óm_Drawing = false ' Àx¦s·sÂI. m_X2 = e.X m_Y2 = e.Y
' ¦b½w½Ä°Ïø¥Ã¤[ª½½u. m_BufferGraphics.DrawLine( _ Pens.Red, m_X1, m_Y1, m_X2, m_Y2)
' ¦b¹Ï§Î¤è¶ô¤W«Ã¸·s½uRedraw to show the new line. DrawPictureBox(PicDraw.CreateGraphics()) '½Ð´ú¸ÕµL¦¹«ü¥O®É,¦³§_ÅÜ¤Æ LblMuxy1.Text = "x= " & m_X1 & "y= " & m_Y1 '¦h¾l±±¨î¶µ¥i²¾°£ LblMuxy2.Text = "x= " & m_X2 & "y= " & m_Y2 '¦h¾l±±¨î¶µ¥i²¾°£ LblMU_m_Drawing.Text = m_Drawing '¦h¾l±±¨î¶µ¥i²¾°£ End Sub
' «Ã¸¹Ï§Î¤è¶ôRedraw the PictureBox Private Sub picDraw_Paint(ByVal sender As Object, ByVal e As _ System.Windows.Forms.PaintEventArgs) Handles _ PicDraw.Paint DrawPictureBox(e.Graphics) End Sub ' «Ã¸¤wÀx¦s¦b½w½Ä°Ïªº¹Ï§Î¦Ü¹Ï§Î¤è¶ô. Private Sub DrawPictureBox(ByVal gr As Graphics) If Not (m_BufferBitmap Is Nothing) Then 'm_BufferBitmap¦³¹Ï¤¸®É,«Ã¸¤wÀx¦s¦b½w½Ä°Ïªº¹Ï§Î¦Ü¹Ï§Î¤è¶ô Dim gp As Graphics = PicDraw.CreateGraphics gp.DrawImage(m_BufferBitmap, 0, 0) 'µL¦¹³¯z¥y¾ó¥Öµ¬½u¤£·|¶î©Ù±¼
End If End Sub
¤W±©Ò¤¶±ªº¶È¬O¤@¯ëª½½u¾ó¥Öµ¬½uµeªk¡A¨ä¥L½Ñ¦p¶ê¡B¶ê©·¡B¾ò¶ê¡B¾ò¶ê©·¡B¦h«½u¡B¦hÃä§Î¡B¯x§Îµ¥¾ó¥Öµ¬½uµeªk¡A«h¥tÅP±M³¹°Q½×¡C
Dim bmp As Bitmap ¡¥FormLoad ¤¤ Dim gp As Graphics = Graphics.FromImage(PicDraw.Image) gp.Clear(PicDraw.BackColor) bmp = New Bitmap(PicDraw.Image) End sub
Mouse_Moveµ{§Ç¤¤ Case "Move", "Copy" Select Case npt Case 0 tLine.pt0 = visPoint tLine.pt1 = visPoint
Case 1 tLine.pt1 = visPoint dx = tLine.pt1.X - tLine.pt0.X dy = tLine.pt1.Y - tLine.pt0.Y tLine.mPen = defaultCadpen Dim bmpf As New Bitmap(bmp) DrawMoveSelection(bmpf, PicDraw, DrawGeo, cView, Selection, dx, dy, False) PicDraw.Image = bmpf End Select End Sub
Mouse_Upµ{§Ç¤¤
Case "Move", "Copy" '·s¥[ If e.Button = Windows.Forms.MouseButtons.Left Then Dim bmpf As New Bitmap(bmp) Select Case npt Case 0 'DrawCadLine(picdraw, tptLine, glPenDr) tLine.pt0 = visPoint 'PtsKM(NptsKM).x tLine.pt1 = visPoint 'tline.pt0 npt = npt + 1 DrawCadline(PicDraw, tLine) '¦¹³¡¥÷·|¼vÅTª½½u¬O§_¥Ñ0,0µe°_
Case 1 tLine.pt1 = visPoint dx = tLine.pt1.X - tLine.pt0.X dy = tLine.pt1.Y - tLine.pt0.Y
npt = 0 '°±¤î§GÂI isDraw = False '°±¤î§GÂI 'For i As Integer = 0 To UBound(Selection) 'MsgBox("selection.type= " & Selection(i).Type) ' Next For i = 0 To UBound(DrawGeo) Call DrawMoveSelection(bmpf, PicDraw, DrawGeo, i, Selection, dx, dy, True) '¤W±³¯z¥y¶Èµe¹Ï¥¼§ïÅܰO¾ÐÅ餺®e If tCommand = "Copy" Then MoveSelection(DrawGeo(i), Selection, dx, dy, True) '§ïÅܰO¾ÐÅ餺®e Else MoveSelection(DrawGeo(i), Selection, dx, dy, False) End If Next i RedrawBoth(bmpf, PicDraw) SelectionReStart() bmp = New Bitmap(PicDraw.Image) '§ó·s©³¹Ï End Select End If End sub VB_VB NET: chday169
¡@ ¡@ ¡@ ¡@ |
¤W¦¸×§ï¦¹ºô¯¸ªº¤é´Á¡G 2018¦~11¤ë25¤é