PDA

View Full Version : پیدا کردن نقاط رنگی عکس



m.4.r.m
شنبه 18 آذر 1391, 10:16 صبح
سلام دوستان من می خوام یه عکس رو تو برنامه لود کنم خوب حالا این عکس از چندین رنگ متنوع تولید شده دیگه منظورم هر پیکسل اون هستش می خوام تمام پیکسل های رنگی این عکس رو پیدا کنم مثلا این عدد بدست میاد که تو نقطه x,y رنگ RGB = 122345 هست می خوام در تمام نقاط اینو پیدا کنم . مرسی

M.T.P
شنبه 18 آذر 1391, 13:13 عصر
سلام
عکس رو بارگزاری می کنید.
عرض و ارتفاع عکس رو در میارید. (یا Scale Mode رو Pixel بگذارید یا با ScaleX و ScaleY تبدیل به Pixel کنید )
با توجه به طول و عرض به دست اومده با دو حلقه تو در تو کل پیکسل ها رو با تابع GetPixel بدست میارید و مقایسه می کنید.

Private Declare Function GetPixel Lib "gdi32" Alias "GetPixel" (ByVal hdc As Long, ByVal x As Long, ByVal y As Long) As Long

m.4.r.m
شنبه 18 آذر 1391, 14:52 عصر
میشه با یک مثال توضیج بدید من نوشتم اینطوری "

Private Declare Function GetPixel Lib "gdi32" (ByVal hdc As Long, ByVal x As Long, ByVal y As Long) As Long
Private Sub Form_Load()
Text1.Text = Picture1.Width
Text2.Text = Picture1.Height
Dim i, j As Integer
For i = 1 To Text1.Text
For j = i To Text2.Text
List1.AddItem GetPixel(Picture1.hdc, 10, 10)
Next j
Next i
End Sub

SlowCode
شنبه 18 آذر 1391, 15:22 عصر
سلام
این همون کد خودته با یکم ویرایش:
Private Declare Function GetPixel Lib "gdi32" (ByVal hdc As Long, ByVal x As Long, ByVal y As Long) As Long
Private Sub Form_Load()
Dim i, j As Integer
For i = 1 To Picture1.ScaleWidth
For j = i To Picture1.ScaleHeight
if GetPixel(Picture1.hdc, i, j)=122345 then list1.additem "X:" & i & " " & "Y:" & j
Next j
Next i
End Sub

می خوام تمام پیکسل های رنگی این عکس رو پیدا کنم
مساله اصلی اینه که چطور بفهمی رنگ مورد نظر سیاه و سفید نیست!
فکر کنم باید R,G,B رو ازش جدا کنی و بگی اگه هر سه رنگ تقریبا با هم برابر نبودن به عنوان رنگی تشخیص بده.
مثلا به ازای R=200,g=202,b=205 یه رنگ سیاه و سفید بدست میاد. البته ممکنه از ترکیب های دیگه هم بدست بیاد.

m.4.r.m
شنبه 18 آذر 1391, 15:28 عصر
خوب اگه بخوام از نقطه اول شروع کنه و تقریبا یکی یکی پیکسل هارو بخونه و عددشو بنویسه چه جوری بنویسم ؟

SlowCode
شنبه 18 آذر 1391, 15:37 عصر
خب اون کدی که گذاشتم واسه همینه دیگه، یکی یکی میخونه اگه فلان رنگ باشه مختصاتش رو توی لیست اضافه میکنه.
اگه اون شرط رو هم برداری رنگ همه پیکسل ها رو می نویسه. Doevents رو هم بعد از شرط بنویس تا نتیجه رو عینا ببینی.

M.T.P
شنبه 18 آذر 1391, 16:57 عصر
دوستان کد رو تو Form_Load ننویسید چون عکس پیداش نیست تابع -1 رو برمیگردونه.
پیکسل ها هم از صفر شروع میشه.
تو یه CommandButton بنویسید.

Option Explicit

Private Declare Function GetPixel Lib "gdi32" (ByVal hdc As Long, _
ByVal x As Long, _
ByVal y As Long) As Long

Private Sub Command1_Click()
Dim i, j As Integer

List1.Clear

For i = 0 To Picture1.ScaleWidth - 1
For j = i To Picture1.ScaleHeight - 1
List1.AddItem GetPixel(Picture1.hdc, i, j)
Next j
Next i

End Sub

m.4.r.m
شنبه 18 آذر 1391, 22:43 عصر
ممنون برنامه خیلی خوب داره کار می کنه فقط یه مشکل کوچیک اونم این که پیکسل های تکراری رو چاپ نکنه و حذفشون کنه اون دستورش چیه ؟ ممنون دوستان

SlowCode
یک شنبه 19 آذر 1391, 19:17 عصر
حذف که معنی نداره باید به جاش یه رنگ دیگه بزاری مثلا سفید یا سیاه(شاید منظورت transparent هست) اگه منظورت اینه باید توی یه آرایه رنگ ها رو ذخیره کنی بعد واسه هر پیکسل جستجو کنی اگه وجود داشت به جاش رنگ سیاه بزاری.
ولی اینطوری سرعت خیلی خیلی کم میشه، فکرش رو بکن واسه هر پیکسل باید یه آرایه چند هزار عضوی رو جستجو کنی!!!

m.4.r.m
یک شنبه 19 آذر 1391, 19:50 عصر
نه منظورم اینه که وقتی 3 تا پیکسل شبیه به هم پیدا کرد 2 تا تکراری ها رو حذف کنه . اینو می خوام

SlowCode
یک شنبه 19 آذر 1391, 20:55 عصر
منظورت بعد از اضافه کردن به لیست باکس هست؟
خب این که کاری نداره برای راحتی کار sort لیست باکس رو فعال کن بعد توی یه حلقه هر رکورد رو با رکورد بعدیش مقایسه کن اگه برابر بود حذفش کن. از راه های دیگه هم می تونی استفاده کنی.

m.4.r.m
دوشنبه 20 آذر 1391, 10:22 صبح
اره این کارو می تونم بکنم اما در موقع چاپ بعد از یک سری اعداد عدد -1 رو مرتب چاپ می کنه این چیه ؟ چطور میشه جلوشو گرفت ؟

SlowCode
دوشنبه 20 آذر 1391, 13:01 عصر
كد حذف كردن و پرينتت رو بزار اينجا احتمالا اشتباه نوشتي.

m.4.r.m
دوشنبه 20 آذر 1391, 13:50 عصر
کد ننوشتم همون کد بالاست که دوستان اشاره کردن
Option Explicit

Private Declare Function GetPixel Lib "gdi32" (ByVal hdc As Long, _
ByVal x As Long, _
ByVal y As Long) As Long

Private Sub Command1_Click()
Dim i, j As Integer

List1.Clear

For i = 0 To Picture1.ScaleWidth - 1
For j = i To Picture1.ScaleHeight - 1
List1.AddItem GetPixel(Picture1.hdc, i, j)
Next j
Next i

End Sub