¡@

VB Net Graphics method(B)

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¥D­n¦³(a)ÂI°}¹Ï(bitmap)¡A¤Î(b)¦V¶q¹Ï(Metafile)¨âºØ¡C¦V¶q¹ÏÀx¦sªº´N¬O²£¥Í¹Ï¹³ªº´y­z¤Îø¹Ï«ü¥O¡A¤£¬O±N¹Ï¹³¥H¼Æ¦ì¤Æªº¹Ï¥Ü¥Nªí¡A¨ä¸û¾A¦X¥Î¨Ó´y­z¥Ñ¤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¹Ïªº¥D­n°Ï§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¤W­z§@·~¤è¦¡Ãþ¦ü¡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¥u­n³Ì«áµ²ª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¤W­z8¡Ñ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¥Î¤W­zµ{¦¡¡A¥i¥H±NÂI°}¹ÏÀx¦s¦¨bmp¹ÏÀÉ¡AµM«á§Q¥ÎUltraEditŪ¥Xbmp¤º®e¦p¤U¡G

 

 

©Î§Q¥Îµ{§ÇŪ¥X¹³¯À¸ê®ÆÀɮצp¤U©Ò¥Ü¡G

 

FF

FF

FF

FF

FF

FF

FF

FF

FF

FF

FF

FF

FF

FF

FF

FF

FF

FF

FF

FF

FF

FF

FF

FF

FF

FF

FF

FF

00

00

00

FF

FF

FF

FF

FF

FF

FF

FF

FF

FF

FF

FF

FF

FF

FF

FF

FF

FF

FF

FF

FF

FF

FF

FF

FF

00

00

00

FF

FF

FF

FF

FF

FF

FF

FF

FF

FF

FF

FF

FF

FF

FF

FF

FF

FF

FF

FF

FF

FF

FF

FF

FF

00

00

00

FF

FF

FF

FF

FF

FF

FF

FF

FF

FF

FF

FF

FF

FF

FF

FF

FF

FF

FF

FF

FF

FF

FF

FF

FF

00

00

00

FF

FF

FF

FF

FF

FF

FF

FF

FF

FF

FF

FF

FF

FF

FF

FF

FF

FF

FF

FF

FF

FF

FF

FF

FF

00

00

00

FF

FF

FF

FF

FF

FF

FF

FF

FF

FF

FF

FF

FF

FF

FF

FF

FF

FF

FF

FF

FF

FF

FF

FF

FF

00

00

00

FF

FF

FF

FF

FF

FF

FF

FF

FF

FF

FF

FF

FF

FF

FF

FF

FF

FF

FF

FF

FF

FF

FF

FF

FF

00

00

00

FF

FF

FF

FF

FF

FF

FF

FF

FF

FF

FF

FF

FF

FF

FF

FF

FF

FF

FF

FF

FF

FF

FF

FF

FF

FF

FF

FF

FF

FF

FF

FF

FF

FF

FF

FF

FF

FF

FF

FF

FF

FF

FF

FF

FF

FF

FF

FF

FF

FF

FF

FF

FF

FF

FF

FF

FF

 

­n¸ÑŪ¤W­z¸ê®Æ¡A´N¥²¶·ÁA¸ÑÂI°}¹ÏªºÀÉ®×µ²ºc¡CÂI°}¹ÏÀÉ®×µ²ºc¥]§t¥|­Ó¥D­n³¡¥÷:

(1)Bitmap File Header (ÂI°}¹ÏÀÉÀY)

(2)Bitmap Info Header (ÂI°}¹ÏÀÉÀY¸ê°T)

(3)Color Table (Palette) (ÂI°}¹Ï½Õ¦âªO)

(4)Bitmap Array(ÂI°}¹Ï¹³¯ÀÃC¦â)

 

 

¡@

Shift(¦ì¤¸²Õ°¾²¾¶q,¬A©·¤º¼Æ¦r¬°Äæ¦ì½d³ò)

Name(Äæ¦ì¦WºÙ)

Size(¤j¤p)

Content(¤º®e)

Bitmap
File
Header

(ÂI°}¹ÏÀÉÀY)

0000h(0~1)

Identifier (ID)

2

'BM'

0002h(2~5)

File Size

4

¾ã­ÓÂI°}¹ÏÀɮתº¤j¤p(³æ¦ì¡Gbyte¡^

0006h(6~9)

Reserved

4

«O¯dÄæ¦ì

000Ah(10~13)

Bitmap Data Offset

4

ÂI°}¹Ï¸ê®Æ¶}©l«eªºÁ`°¾²¾¶q¡]·N«ü°}¹Ï¸ê®Æ¥Ñ¦¹Äæ°_ºâ¡A³æ¦ì¡Gbyte¡^

Bitmap
Info
Header

ÂI°}¹Ï¸ê®ÆÀÉÀY

000Eh(14~17)

Bitmap Header Size

4

Bitmap Info Header ªºªø«×,¦¹Äæ¦ì¼Æ­È³q±`¬O28h(40byte)¡C

0012h (18~21)

Width

4

ÂI°}¹Ïªº¼e«×(³æ¦ì¡Gpixel¡^

0016h(22~25)

 

Height

4

ÂI°}¹Ï°ª«×(³æ¦ì¡Gpixel¡^¡C°ª«×¥i¥H¬°­t­È¡A­t­Èªí¥Ü±½ºË¤è¦V¥Ñ¤W¦Ó¤U¡C¦ý­Y°ª«×­t­È®É¡AÂI°}¹Ï¤£¯àÀ£ÁY¡C

001Ah(26~27)

Planes

2

ÂI°}¹Ïªº¦ì¤¸¹Ï¼h¼Æ¡C³q±`¦h³]©w¬°1¡C

001Ch(28~29)

Bits Per Pixel (biBitCount)

2

¨C­Ó¹³¯À»Ý¨Dªº¦ì¤¸²Õ¼Æ
1
¡G³æ¦âÂI°}¹Ï¡]¨Ï¥Î2^1= 2 ¦â½Õ¦â½L¡^
4
¡G4 ¦ì¤¸ÂI°}¹Ï¡]¨Ï¥Î 2^4=16 ¦â½Õ¦â½L¡^
8
¡G8 ¦ì¤¸ÂI°}¹Ï¡]¨Ï¥Î2^8= 256 ¦â½Õ¦â½L¡^
16
¡G16 ¦ì¤¸°ª±mÂI°}¹Ï¡]2^16,¤£¤@©w¨Ï¥Î½Õ¦â½L¡^
24
¡G24 ¦ì¤¸¥þ±mÂI°}¹Ï¡]¤£¨Ï¥Î½Õ¦â½L¡^
32
¡G32 ¦ì¤¸¥þ±mÂI°}¹Ï¡]¤£¤@©w¨Ï¥Î½Õ¦â½L¡^¡C

001Eh(30~33)

Compression

4

À£ÁY¤è¦¡¡G
0
¡G¥¼À£ÁY
1
¡GRLE 8-bit/pixel
2
¡GRLE 4-bit/pixel
3
¡GBitfields

 

0022h(34~37)

Bitmap Data Size

4

ÂI°}¹Ï¸ê®Æªº¤j¤p(byte¡^¡A­Y¨S¦³À£ÁY¡]Äæ¦ì¥i¥H¬° 0¡^¡C

0026h(38~41)

H-Resolution

4

¤ô¥­¸ÑªR«×¡]³æ¦ì¡G¹³¯À/¤½¤Ø¡^­Y­n´«ºâ¬° dpi¡A«h°£¥H39.37¡C

002Ah(42~45)

V-Resolution

4

««ª½¸ÑªR«×¡]³æ¦ì¡G¹³¯À/¤½¤Ø¡^

002Eh(46~49)

Used Colors

4

ÂI°}¹Ï¨Ï¥Îªº½Õ¦â½LÃC¦â¼Æ¡A¦¹ªí¥Ü¹ÏÀɹê»Ú¨Ï¥ÎªºÃC¦â¼Æ¥Ø¡A­Y¼Æ­È¬° 0¡Aªí¥Ü¨Ï¥Î©Ò¦³½Õ¦â½LÃC¦â¡C¦pªG¦¹Äæ¼Æ­È¨Ã«D¡u¥i¨Ï¥ÎÃC¦âªº³Ì¤j­È¡v©ÎªÌ¡u¹s¡v¡A«h»Ýª`·N½Õ¦â½L¤Ø¤oªº­pºâ¡C
¨Ò¦p¡A¦b 4 bpp bitmap ¤¤¡A½Õ¦â½L¹w³]¤Ø¤oÀ³¬O 16*4 bytes¡A¦ý­Y Used Color Äæ¦ì¼Æ­È¨Ã«D 16 ©Î 0¡A«h½Õ¦â½L¤Ø¤oÀ³¬OUsed_Color_Number * 4 (bytes)¡C

0032h(50~53)

Important Colors

4

­«­nªºÃC¦â¼Æ¡A¦pµ¥©ó¡uÃC¦â¼Æ¡v©ÎªÌ¬° 0 ®É¡Aªí¥Ü©Ò¦³ÃC¦â³£¤@¼Ë­«­n

Palette

0036h(54~

Palette

N*4

½Õ¦â½L¸ê®Æ¡C¨C­Ó¯Á¤Þ­È«ü©w¤@ºØÃC¦â¡G0x00RRGGBB
¨ä¤¤³Ì°ª¦ì¤¸²Õ«O¯d¬°¹s

Bitmap
Array

(ÂI°}¹Ï¸ê®Æ)

-

Bitmap Data

-

¨C¤@±½´y¦Cªºªø«×¨ú¨M©ó¹ÏÀɪº¼e«×¤ÎÃC¦â²`«×¡]Color Depth¡^¡A¦ý¬O¨C¤@±½´y¦Cªºªø«×¥²»Ý¬O 4 byte ªº­¿¼Æ¡C¥¿±`ªºÂI°}¹Ï±½´y¦C¬O¥Ñ©³¦V¤WÀx¦sªº¡G°}¦C¤¤ªº²Ä¤@­Ó byte ªí¥Ü¹ÏÀÉ¥ª¤U¨¤ªº¹³¯À¡A¦Ó³Ì«á¤@­Ó byte «hªí¥Ü¥þ¹Ï¥k¤W¨¤ªº¹³¯À¡C¦ý¦pªG¬O¥¿¦V±½´y¡]Height Äæ¦ì¬°­t­È¡^¡A«h±½´y¤è¦V«h¬O¥Ñ¤W¦Ó¤U¡C

 

¹ï·Ó¤W­z¤§ÂI°}¹Ï¡A§Ú­Ì±N¨ä¾ã²z¦p¤Uªí¥H¤è«K¸Ñ»¡¡C

 

 

¡@

Shift

Name

Size
(bytes)

Content

Remark

Bitmap
File
Header

0000h(0~1)

Identifier (ID)

2

42 4D

(424D)BM

0002h(2~5)

File Size

4

36 01 00 00

(0136) 310 bytes

0006h(6~9)

Reserved

4

00 00 00 00

0

000Ah(10~13)

Bitmap Data Offset

4

36 00 00 00

(0036)54 bytes

Bitmap
Info
Header

000Eh(14~17)

Bitmap Header Size

4

28 00 00 00

(0028)40 bytes

0012h (18~21)

Width

4

08 00 00 00

(0008)8 bytes

0016h(22~25)

 

Height

4

08 00 00 00

(0008) 8bytes

001Ah(26~27)

Planes

2

01 00

(0001) 1

001Ch (28~29)

Bits Per Pixel

2

20 00

(0020) 32 bits

001Eh(30~33)

Compression

4

00 00 00 00

¤£À£ÁY

0022h(34~37)

Bitmap Data Size

4

00 00 00 00

0 bytes(¤£À£ÁY)

0026h(38~41)

H-Resolution

4

C4 0E 00 00

(0EC4) 3780 bytes/m=96dpi

002Ah(42~45)

V-Resolution

4

C4 0E 00 00

(0EC4) 3780 bytes/m=96dpi

002Eh(46~49)

Used Colors

4

00 00 00 00

0

0032h(50~53)

Important Colors

4

00 00 00 00

0

Palette

0036h(54~57)

Palette

N*4

00 00 00 00

µL¦â½L

 

(54~146)

¨C3­Óbyte¥Nªí

 

FF FF FF

¥Õ¦â

 

 

1­Ó¹Ï¤¸¬°¥Õ¦âÁ`¼Æ93bit¡A¥Nªí31­Ó¹Ï¤¸

 

 

 

 

(147~149)

1­Ó¹Ï¤¸¬°¶Â¦â

 

00 00 00

¶Â¦â

 

 

 

 

 

 

 

(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«á¡A­n´«ºâ¬°¤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

 

0

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

 

(a)¿Ã¹õ©ÒÅã¥Ü¤§ÂI°}¹Ï(±½ºË¤è¦V¥Ñ56~63,48~55,¡K¡K¡K,1~7)

 

56

57

58

59

60

61

62

63

48

49

50

51

52

53

54

55

40

41

42

43

44

45

46

47

32

33

34

35

36

37

38

39

24

25

26

27

28

29

30

31

16

17

18

19

20

21

22

23

8

9

10

11

12

13

14

15

0

1

2

3

4

5

6

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«e­z¶Â¥ÕÀÉ®×°£¹³¯ÀÃ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

 

¦Ü©ó¤W­z¸ê®Æ¦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

 

    ¤W­z¦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

 

¤W­z§@·~«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·|§ïÅܪº¥D­n¬O¹³¯ÀÃC¦â¸ê®Æ¡C¦p«e­z¤§¶Â¥Õ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

¤W­z¦U¶µ§@·~¦h¥]§t(a)Ū¨ú¹³¯À¸ê®Æ¡A(b)¹³¯ÀÃC¦â¸ê®Æ¹Bºâ¡A(c)±N³B²z¹L«áÃC¦â¸ê®Æ¼g¦^­ì¼v¹³ÀɮסA(d)Åã¥Ü·s¼v¹³¡Aµ¥¥|­Ó¥D­n¨BÆJ¡CVB NETÁö´£¨Ñ¦³GetPixel()¤ÎSetPixel()¤§¹³¯À³B²z¤èªk¡A¨ä³B²z¤p¹Ï´T¼v¹³¬O«Üª½±µ¡B¤è«K¡A¦ý¦p­n³B²z¸û¤j¹Ï´T¼v¹³´NÅã±o¦³¨Ç¤O¤£±q¤ß¡C­n³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

¤W­zµ{¦¡½X¡A¹³¯ÀÃC¦â¦ì¤¸¬O¤@ºû«×¡C¦p­n§ï¦¨¤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

 

¤W­z¦ì¤¸¹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¹³¬Û´î¥D­n¬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¹³¥­§¡¥D­n¬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¥D­n¬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

 

        ' ½Æ»s­I´ºÃä½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¥ú¥D­n¬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

 

1/9

1/9

1/9

1/9

1/9

1/9

1/9

1/9

1/9

¨Ï¥Î¤£¦P¤§Kernel°}¦C­È¹Bºâ¡A·|²£¥Í¤£¦Pªº¼v¹³¦¨ªG¡C¦p¤U­±¤§Kernel°}¦C¬°§C«×Âo¥ú(Low-pass filters)

 

 

1/15

2/15

1/15

2/15

3/15

2/15

1/15

2/15

1/15

¦Ó

 

-1

-1

-1

-1

9

-1

-1

-1

-1

«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¹³±ÛÂà¥D­n¬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¥D­n¬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¥D­n¬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¤W­z¹³¯À¹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¶·±N­pµ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¯à»Ý­n­pºâÂà´«¯x°}¤¤¦U§O¤¸¯À¡C¦p¤U­±ªº¤ù¬qµ{¦¡¡G

 

Dim myMatrix As Matrix =  New Matrix(1, 0, 0, 2, 0, 0) ¡¥¤»­Ó¼Æ¦r©Ò¥Nªíªº¯x°}
myMatrix.Scale(2, 2)
¡¥¤ñ¨ÒÂà´«

¡¦«Ø¥ß¤@­Óµe¹Ïª«¥ó¡A¤Î¤@­Ó¶Â¦â¯x§Î
Dim Gp as Graphics = PictureBox1.CreateGraphics

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¤W­zªº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)


¹Bºâµ²ªG¬O¤£¤@¼Ëªº¡C

¡@

¯x°}Âà´«¦³©Ò¿×°Ï°ìÂà´«¤Î¥þ°ìÂà´«¨âºØ¡A¥þ°ìÂà´«·|®M¥Î¦Ü¯S©wGraphicsª«¥óø»sªº©Ò¦³¶µ¥Ø¡F¬Û¹ï¦a¡A°Ï°ìÂà´«¥u®M¥Î¦Ü­nø»sªº¯S©w¶µ¥Ø¡C

¦pªG­n«Ø¥ß¥þ°ìÂà´«¡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·Q­n¨Ï¥Î¤@­Ó®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¨ä¥D­n¤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¥D­n¥\¯à¬°¡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¥D­n¥\¯à¬°¡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

 

Name(±zªº¤j¦W)
E_MAIL(±zªº¹q¤l«H½c)
Comment or Suggestion(±z·Q¤ÏÀ³ªºª¬ªp¡A«Øij¡A©Î¿Ô¸ß¨Æ¶µ)
­º­¶


¡@

¡@

¡@

¡@

­º­¶ | ¦p¦ó¨Ï¥ÎExcel¸Õºâªí§@µ{¦¡¸ê®Æ¿é¤J | ¦p¦óø»sµ¥°ª½u | ¸Ñ3DÁô¨ç¼Æ | ¤uµ{¥òµô®×¨Ò»¡©ú | Spline_Bezier¦±½u´úø | VB6¤uµ{­pºâ¾÷µ{¦¡³]­p | VB NET¤uµ{­pºâ¾÷µ{¦¡³]­p | ¦p¦ó¦bVB6¤¤¨Ï¥ÎVbscript & Dll | ®}ª@¦hÃä§Î | ª«¥ó¾É¦Vµ{¦¡Â²¤¶ | ¦p¦ó¦bVB6¨Ï¥ÎVB.net¹Ï®×µ§¨ê¤ÎÃC¦âªí | VB Net Graphics method(B) | Graphic method in vb net(A)

¤W¦¸­×§ï¦¹ºô¯¸ªº¤é´Á¡G 2018¦~11¤ë25¤é