View Full Version : تبدیل عکس به ماتریس
omidan321
پنج شنبه 16 آذر 1391, 15:58 عصر
سلام من مخام یه عکسو به ماتریس n*n تبدیل کنم کسی میتونه کمکم کنه ؟ من تازه برنامه نویس رو شروع کردم تو رو خدا قطعه کد ندین ا اگه میدین توضیحشم بدین
منت میذارین سرم اگه تو این کار کمکم کنید
vbhamed
پنج شنبه 16 آذر 1391, 21:28 عصر
سلام
ابتدا دو عدد PictureBox روي فرم بزاريد، خاصيت AutoRedraw و AutoSize اونها رو True كنيد و در PictureBox اول يك تصوير بارگزاري كنيد، تصوير خيلي بزرگ نباشه مثلا 200 در 200
Private Sub Form_Load()
Dim p() As Long
'تعريف آرايه بدون بعد براي ذخيره رنگ نقاط تصوير
Me.ScaleMode = 3
Picture1.ScaleMode = 3
Picture2.ScaleMode = 3
'تغيير واحد اندازه گيري فرم، پيكچر 1 و پيكچر 2 به واحد پيكسل
Dim m&, n&
m = Picture1.Width
n = Picture1.Height
'تعيين عرض و ارتفاع تصوير جهت محاسبه حافظه مصرفي آرايه
ReDim p(m - 1, n - 1) As Long
'تخصيص حافظه به آرايه
Show
DoEvents
'نمايش فرم قبل از اجراي دستورات بعدي
'اين دستورات خيلي مهم است
With Picture1
For i = 0 To m - 1
For j = 0 To n - 1
p(i, j) = .Point(i, j)
Next
Next
End With
'ذخيره رنگ نقاط تصوير در آرايه
Picture2.Width = Picture1.Width
Picture2.Height = Picture1.Height
For i = 0 To m - 1
For j = 0 To n - 1
Picture2.PSet (i, j), p(i, j)
Next
Next
'رسم تصوير از آرايه در پيكچر شماره 2
End Sub
البته اين انجام اين كار به صورت مفهومي است وگرنه با توابعي از API مثل CopyMemory و ... ميشه به سرعت و سادگي اينكار رو انجام داد
mehran901
جمعه 17 آذر 1391, 02:40 صبح
دوست عزیز vbhamed ، ممنون بابت قطعه کد زیبایی که نوشتین ( روش هایی مثل setpixel va getpixel سرعت بی نهایت کمی دارن اگه روش copyMemory رو بگین ممنون می شم )
البته اون عددی که در آرایه 2 بعدی داره ذخیره می شه یک عدد طولانی هست و برای کار های پردازش تصویر بهتره اون رو تبدیل کنین به rgb و یک آرایه سه بعدی برای ذخیره سازی اون در نظر بگیرین
اون عدد long و 8 رقمی شاید دونستنش بد نباشه 16777215 سفید و 0 مشکلی ( کار با طیف اعداد اینگونه که بیانگر رنگ باشن در صورتی که نیاز باشه سخته )
اگه خواستین RGB کنین خیلی ساده می تونین از طریق رابطه r+ g * 256 + b * 256 ^ 2 کد زیر رو خیلی ساده بنویسید
Private Type colortype
red As Long
green As Long
blue As Long
End Type
Dim a As colortype
Private Function rgb1(color As Long) As colortype
rgb1.red = (Int(color And 255)) And 255
rgb1.green = (Int(color / 256)) And 255
rgb1.blue = (Int(color / 65536)) And 255
End Function
a = rgb1(picture1.point (x,y))
شما می تونید از این کد برای گرفتن خروجی RGB تفکیک شده استفاده کنید همونطوری که می بینید اون عدد 8 رقمی توسط تابع rgb1 ما با توجه به رابطه بالا که نوشتم واستون ، داخل تایپ a قرار میگیره
vBulletin® v4.2.5, Copyright ©2000-1403, Jelsoft Enterprises Ltd.