- توردا
- 332 سائەت
- ئاخىرقى قېتىم
- 2012-11-6
- تىزىملاتقان
- 2010-8-15
- شۆھرەت
- 1241
- تىللا
- 1175
- تۆھپە
- 637
- ھوقۇقى
- 40
- جۇغلانما
- 4495
- ئالبوم
- 0
- بلوگ
- 0
- خاتىرە
- 1
- يازما
- 201
- تېما
- 15
- نادىر
- 0
- ھەمبەھر
- 0
- UID
- 237
- تۆھپە
- 637
- تىللا
- 1175
- شۆھرەت
- 1241
|
VB6.0 دە رەسىم بىر تەرەپ قىلىش (1)
VB6.0图像处理
مەزكۇر ماقالە ئارقىلىق VB6.0 دە ئەڭ ئاز كود بىلەن ئەڭ تېز سۈرئەتتىكى رەسىمنى رەڭ جەھەتتىن بىر تەرەپ قىلىش مىسال قىلىنىدۇ (ئەلۋەتتە كودنى كۆپەيتىش ئارقىلىق رەسىم بىر تەرەپ قىلىش سۈرئىتىنى تېخىمۇ تېزلىتىشكە بولىدۇ، ئەمما يېڭى ئۆگەنگۈچىلەر ئۈچۈن ھەم چۈشىنىكسىز ھەم مۇرەككەپ بوپقالىدۇ). مەن مۇشۇنچىلىكلا قىلالىدىم، ناۋادا بۇنىڭدىنمۇ ئاز كود بىلەن بۇنىڭدىن تېز ئۈنۈم يارىتالايدىغانلار بولسا قارشى ئالىمەن (قانداق چارە ياكى كود قوللانمايلى، مەڭگۈ C تىلىدىكى تېزلىك ئۈنۈمىگە يەتكۈزەلمەيمىز).
رەسىم بىر تەرەپ قىلىشنىڭ نېمىلىكىنى PhotoShop ئىشلىتىپ باققانلار بىلىدۇ. بۇ يەردىكى رەڭ جەھەتتىن بىر تەرەپ قىلىش ئەسلى رەسىمدىكى رەڭلەرنى مۇددىئايىمىزغا ئاساسەن مەلۇم قىممەتتىكى رەڭگە ئالماشتۇرۇشنى كۆرسىتىدۇ (مەسىلەن، كۈلرەڭ، قەھۋە رەڭ، مەلۇم بىر خىللا رەڭدە كۆرسىتىش، ياغاچ ئويما، ئاق-قارا، قاپارتما ھەيكەل، غۇۋالاشتۇرۇش، ئېنىقلاشتۇرۇش… دېگەندەك). بۇنىڭ پىرىنسىپى بەك ئاددىي بولۇپ، ھەر بىر نۇقتىدىكى رەڭنى نىشان ئۈنۈمدىكى رەڭ قىممىتىگە كەلتۈرۈپ بولۇپ يەنە ئەسلى رەسىمگە قايتۇرۇپ سىزىش.
كودقا قاراپلا «ۋايجان، مۇشۇ API كودىنى چۈشىنشتىن، ئىشلىتىشتىن ساۋادىم چالا ھەم بىزار ئىدىم، ئەمدى بۇ كىشى ھەجەپ…؟!» دەپ ئويلىماڭلار. مەن شۇنداق بوپقالمىسۇن دەپ API كودىنى ئەڭ ئاز ئىشلەتتىم. بۇ يەردىكى مەقسەت تەگدىن چۈشىنىپ پروگرامما يېزىشنى ئۆگىنىش بولغاچقا نوقۇل سۈرئەت قوغلىشىپ كودنى كۆپ ۋەمۇرەككەپ قىلىشتىن ساقلاندىم. ناۋادا API فۇنكىسىيىسى ئشلەتمەيتتىم، دېگۈچىلەر رەسمىي كودتىن ئىلگىرى تۆۋەندىكى كودنى ئىشلىتىپ ئەڭ ئاددىي شەكىلدە رەسىمدىكى نۇقتىلارنى رېڭىنى ئۆزگەرتىپ سىناڭلار (مىسال پروگراممىدا ئۈچ خىل ئۇسۇلنىڭ تېزلىكتىكى سېلىشتۇرمىسى بېرىلدى. شۇنى سىناپ باقساڭلارمۇ بولىدۇ)، ئاندىن بىلىسىلەركى، سۈرئەت ئىچىڭىزنى پۇشۇرىۋەتكىدەك دەرىجىدە ئاستا.
VB6.0 دىكى رەسىم رامكىسىنىڭ ئۆزىدىلا رەسىمدىكى نۇقتىلارنىڭ رېڭنى ئېلىش ۋە رەسىمدىكى خالىغان نۇقتىغا خالىغان رەڭدە چېكىت ئۇرۇش فۇنكىسىيىسى بار، بەك ئاسان.
ئەمسە سىناقنى باشلايلى. VB6.0 نى قوزغىتىپ، كۆزنەككە بىر دانە رەسىم رامكىسى (图片框PictureBox) سىزىپ، ئۇنىڭ Picture خاسلىقىغا تۆۋەندىكى رەسىمنى ئەكىرىڭلار، AutuSize خاسلىقىنى True قىلىڭلار ۋە ScaleMode، يەنى ئۆلچەم بىرلىكى خاسلىقىنى 3-Pixel قىلىڭلار. ئاندىن كود كۆزنىكىگە كىرىپ تۆۋەندىكى كودنى چاپلاپ سىناڭلار.
- Dim W As Integer, H As Integer, I As Long, J As Long
- Dim R As Integer, G As Integer, B As Integer, Clr As Long,
- Private Function nRed(ByVal mlColor As Long) As Long
- nRed = mlColor And &HFF
- End Function
- Private Function nGreen(ByVal mlColor As Long) As Long
- nGreen = (mlColor \ &H100) And &HFF
- End Function
- Private Function nBlue(ByVal mlColor As Long) As Long
- nBlue = (mlColor \ &H10000) And &HFF
- End Function
- Private Sub Command1_Click(Index As Integer)
- Me.MousePointer = 11
- W = Picture1.ScaleWidth
- H = Picture1.ScaleHeight
-
- For I = 0 To W
- For J = 0 To H
- Clr = Picture1.Point(I, J)
- R = nRed(Clr): G = nGreen(Clr): B = nBlue(Clr)
- Clr = (R + G + B) / 3
- Picture1.PSet (I, J), RGB(Clr, Clr, Clr)
- Next J, I
- Set Picture1.Picture = Picture1.Image
- Me.MousePointer = 0
- End Sub
مەزمۇننى كۆچۈرۈۋېلىش قانداق، ئۈنۈمدىن رازى بولدىڭىزمۇ؟ سۈرئەتتىنچۇ؟!
شۇڭا بىز ئىككى API فۇنكىسىيىسى ئىشلىتىپ سۈرئەتنى ئىككى ھەسسە ئاشۇرۇشنى ياكى ئۈچلا API فۇنكىسىيىسى بىلەن سۈرئەتنى 7-8 ھەسسە كۆتۈرۈشنى تاللايمىز. بۇنداق بولغاندا ھەم ئاددىيراق، چۈشىنىشلىك بولىدۇ، ھەم سۈرئەتتىن ئۇتالايمىز. كۆپراق ئىشلەتسەك سۈرئەتنى تېخىمۇ تېزلەتكىلى بولاتتى، ئەمما مۇرەككەپلىشىپ، پىكرىڭلار چېچىلىدۇ (API فۇنكىسىيىسى ئىشلىتىشنى ئۆگىنىشنىڭ ياخشى ئۇسۇلى دەل ئاۋۋال ئاددىي ئىشلىتىپ، بارا-بارا مۇرەككەپ، كۈچلۈكلىرىنى ئىشلىتىش).
ئەمدى يۇقىرىقى كود ئاساسىدا ئىككى ۋە ئۈچ خىل API فۇنكىسىيىسى ئىشلەتكەن ئەھۋالدىكى تېزلىك ۋە كودنى مىسالدىن كۆرۈپ بېقىڭ (ئېلىش نومۇرى: uQAyCKT2).
يۇقىرىقى جەريانلاردىن كېيىن بىز رەسىمدىكى نۇقتىلارنى ئالىدىغان ۋە ئاخىرىدا ئورنىغا قويىدىغان ئۇنىۋېرسال فۇنكىسيە قۇرۇۋالايلى (مىسالدىكى يەنە بىر فۇنكىسيە ئالماشتۇرۇلدى. مەقسەت، ئۆزگەرتكەن رەسىمنى كېيىنچە ھۆججەت قىلىپ ساقلىغىلى بولۇش ئۈچۈن). يەنى، تۆۋەندىكىدەك:- '用于获得指定类型的当前选定对象
- Public Declare Function GetCurrentObject Lib "gdi32" (ByVal hdc As Long, ByVal uObjectType As Long) As Long
- '用这个函数删除GDI对象,比如画笔、刷子、字体、位图、区域以及调色板等等。对象使用的所有系统资源都会被释放
- Public Declare Function DeleteObject Lib "gdi32" (ByVal hObject As Long) As Long
- '将来自一幅位图的二进制位复制到一幅与设备无关的位图里
- Public Declare Function GetDIBits Lib "gdi32" (ByVal hdc As Long, ByVal hbmp As Long, ByVal uStartScan As Long, ByVal cScanLines As Long, lpvBits As Any, lpbmi As Any, ByVal uUsage As Long) As Long
- '将一幅与设备无关位图的全部或部分数据直接复制到一个设备。这个函数在设备中定义了一个目标矩形,以便接收位图数据。它也在DIB中定义了一个源矩形,以便从中提取数据
- Public Declare Function SetDIBitsToDevice Lib "gdi32" (ByVal hdc As Long, ByVal x As Long, ByVal y As Long, ByVal dx As Long, ByVal dy As Long, ByVal SrcX As Long, ByVal SrcY As Long, ByVal Scan As Long, ByVal NumScans As Long, Bits As Any, BitsInfo As BITMAPINFO, ByVal wUsage As Long) As Long
- Public Const OBJ_BITMAP = 7
- Public Const DIB_RGB_COLORS = 0
- Public Type BitMapInfoHeader '文件信息头——BITMAPINFOHEADER
- biSize As Long
- biWidth As Long
- biHeight As Long
- biPlanes As Integer
- biBitCount As Integer
- biCompression As Long
- biSizeImage As Long
- biXPelsPerMeter As Long
- biYPelsPerMeter As Long
- biClrUsed As Long
- biClrImportant As Long
- End Type
- Public Type RGBQuad
- rgbBlue As Byte
- rgbGreen As Byte
- rgbRed As Byte
- 'rgbReserved As Byte
- End Type
- Public Type BITMAPINFO
- bmiHeader As BitMapInfoHeader
- bmiColors As RGBQuad
- End Type
- Public Const Bits As Long = 32 '颜色深度,这里把所有图像都按照32位来处理
- Public ColVal() As Byte '用于存放从DIB输入/输出的像素值
- Public iBitmap As Long
- Public BI As BITMAPINFO '定义BMP信息
- Public I As Long, J As Long
- Public W As Long, H As Long
- Public C As Long, R As Integer, G As Integer, B As Integer
- Public Function GetPixel(Obj As Object) As Long
- W = Obj.ScaleWidth: H = Obj.ScaleHeight
- ReDim ColVal(3, W, H) As Byte
- With BI.bmiHeader
- .biBitCount = Bits
- .biCompression = 0
- .biPlanes = 1
- .biSize = Len(BI.bmiHeader)
- .biWidth = W
- .biHeight = H
- End With
- iBitmap = GetCurrentObject(Obj.hdc, OBJ_BITMAP)
- GetPixel = GetDIBits(Obj.hdc, iBitmap, 0, H, ColVal(0, 0, 0), BI, DIB_RGB_COLORS) '获得图片像素信息
- DeleteObject iBitmap
- End Function
- Public Function SetPixel(Obj As Object) As Long
- With BI.bmiHeader
- LineBytes = ((W * Bits + 31) And &HFFFFFFE0) \ 8
- .biSizeImage = LineBytes * H
- End With
- SetPixel = SetDIBitsToDevice(Obj.hdc, 0, 0, W, H, 0, 0, 0, H, ColVal(0, 0, 0), BI, DIB_RGB_COLORS)
- Erase ColVal: Set Obj.Picture = Obj.Image ': Obj.Refresh
- End Function
- Public Function nRed(ByVal mlColor As Long) As Long
- nRed = mlColor And &HFF
- End Function
- Public Function nGreen(ByVal mlColor As Long) As Long
- nGreen = (mlColor \ &H100) And &HFF
- End Function
- Public Function nBlue(ByVal mlColor As Long) As Long
- nBlue = (mlColor \ &H10000) And &HFF
- End Function
مەزمۇننى كۆچۈرۈۋېلىش بۇنى بىر دانە بۆلەك (模块Module) ھۆججىتىگە ساقلىۋېلىپ، بۇندىن كېيىنكى ھەر خىل رەسىم ئۆزگەرتىشلەردە چاقىرىپ ئىشلىتىمىز. ئىشلىتىش ئۇسۇلى تۆۋەندىكىدەك:- Private Sub Command1_Click()
- Picture1.Picture = LoadPicture("")
- Me.MousePointer = 11: GetPixel Picture1
- For I = 0 To W
- For J = 0 To H
- R = ColVal(2, I, J): G = ColVal(1, I, J): B = ColVal(0, I, J)
- C = (R + G + B)/3 ‘这是核心代码,处理像素点
- ColVal(0, I, J) = C:ColVal(1, I, J) = C:ColVal(2, I, J) = C
- Next J
- Next I
- Call SetPixel(Picture1):Me.MousePointer = 0
- End Sub
مەزمۇننى كۆچۈرۈۋېلىش كودتىكى ھالقىلىق كود، دېگەن قۇرى (ئۇيغۇرچە ئىزاھات قىلمىدىم، نورمال كۆرۈنمەيدۇ) دەل بىزنىڭ رەسىم بىر تەرەپ قىلىشتىكى مۇھىم ھەل قىلىش ئۇسۇلى، يەنى ئالگورىزم (ھېسابلاش ئۇسۇلى算法Algorithm) بولۇپ، مۇشۇنى ئۆزگەرتىش ئارقىلىق ئوخشىمىغان ئۈنۈملەرنى ئەمەلگە ئاشۇرالايمىز. ماقالىنىڭ باشقا قىسىملىرى مۇشۇ بىر قۇر ئۇسۇلنى ئۆزگەرتىش ئارقىلىق داۋاملىشىدۇ، سىنىغاندا مۇشۇ قۇرنى ئالماشتۇرساڭلار بولىدۇ. ۋاقىپ بولغايسىزلەر.
مەنبە ۋە تېما داۋاملىشىش ئادرېسى: يارۇق بلوگى بۇ يازمىنى ئاخىرىدا mars36 تەھرىرلىگەن. ۋاقتى 2012-7-19 17:00
|
|