PDA

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 قرار میگیره