# Native Code > برنامه نویسی در 6 VB > برنامه نویسی مرتبط با بازی و گرافیک در VB6 >  برداشتن pixel  های یک عکس

## ehsanocx

با سلام
دوستان چطوری می تونم پیکسل های موجود در یک عکس رو بردارم بریزم توی یک ظرفی ؟
کسی شبه کدی داره؟ کدش چیه ؟ با تشکر

----------


## aryasoft2872

تابع Getpixel

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

----------


## ehsanocx

> تابع Getpixel
> 
> Public Declare Function GetPixel Lib "gdi32" Alias "GetPixel" (ByVal hdc As Long, ByVal x As Long, ByVal y
>  As Long) As Long



دوست من این کد رو کجا Paste کنم؟ توی صفحه کد Paste  کردم قرمز شد چرا ؟
میشه این تیکه سورس رو به صورت برنامه بگذاری که بدونم چطوری کار می کنه یا راهنماییم کنی ؟ با تشکر

----------


## REZADG

> دوست من این کد رو کجا Paste کنم؟ توی صفحه کد Paste  کردم قرمز شد چرا ؟
> میشه این تیکه سورس رو به صورت برنامه بگذاری که بدونم چطوری کار می کنه یا راهنماییم کنی ؟ با تشکر


برای این که کر دو تیکه شدی این تیکه ی پایینی رو به آخر سطر اول ببر و یه فاصله بده و در ضمن در قسمت جنرال برنامه پیست کن

----------


## ehsanocx

چطوری از این تابع استفاده کنم دوست من؟  مقدار RGB  اون پیکسل رو چطوری نمایش بدم توی Text ?

----------


## ehsanocx

Copile Error
Constants, Fixed -length, arrays .user -defined types and declare statements not allowes as public members of object modules
این Error  رو میده برای چیه؟ میشه استفاده از این ماژول رو توی یه نمونه سورس توضیح بدین با تشکر

----------


## aryasoft2872

برای رفع ارور بالا Public رو تبدیل به Private کنید این هم مثالی از کارکرد این API:

----------


## ehsanocx

دوست من می خوام پیکسل های عکسی که درون یک Picture box  دارم رو بدست بیارم چطوری می تونم چنین کاری کنم؟ کد RGB  رو چطوری می تونم برای هر پیکسل بدست بیارم؟

----------


## ehsanocx

دوست من من کد هر پیکسل رو بدست آوردم کد پیکسل عکسی که داخل pictuer box  هست رو.

حالا چطوری می تونم بوسیله دو تا حلقه for  . همه ی پکسل های سطر و ستون رو بدست بیارم ؟

----------


## aryasoft2872

خودتون جواب خودتون رو دادید،به کمک دو تا حلقه For...

----------


## ehsanocx

دوست من 
من نمی دونم کجا باید این حلقه ها رو قرار بدم و به چه صورتی باید قرار بدم میشه کدم رو اصلاح کنید ؟ Code.zip

----------


## ehsanocx

دوستان کسی کمک نمی تونه کنه؟

----------


## xxxxx_xxxxx

حلقه های For یک چیزی تو این مابه ها میشه:

Dim i, j, x, y As Long
Dim Row As String
For i = 0 To picSource.Height
    For j = 0 To picSource.Width
        Row = Row & GetPixel(picSource.hDC, i, j) & "  "
    Next j
    txtCodeBinery.Text = txtCodeBinery.Text & Row & vbCrLf
    Row = ""
Next i


فقط باید خروجی تابع GetPixel رو به معادل RGB تبدیل کنید بعد توی متغیر Row قرار بدید.

----------


## ehsanocx

> حلقه های For یک چیزی تو این مابه ها میشه:
> 
> Dim i, j, x, y As Long
> Dim Row As String
> For i = 0 To picSource.Height
>     For j = 0 To picSource.Width
>         Row = Row & GetPixel(picSource.hDC, i, j) & "  "
>     Next j
>     txtCodeBinery.Text = txtCodeBinery.Text & Row & vbCrLf
> ...




این کد ها رو توی یک دکمه می گذارم برنامه رو اجرا می کنم روی دکمه کلیک می کنم. برنامه هنگ می کنه؟

من منظورتون رو از این جمله اتون نفهمیدم

فقط باید خروجی تابع GetPixel رو به معادل RGB تبدیل کنید بعد توی متغیر Row قرار بدید

؟

----------


## ehsanocx

Private Sub CmdShowConvertBinery_Click()
 Dim Red As Integer, Green As Integer, Blue As Integer
Dim i, j, x, y, ColorValue As Long
Dim Row As String
For i = 0 To picSource.Height
    For j = 0 To picSource.Width
      ColorValue = GetPixel(picSource.hDC, x, y)

    'Extract red, green, blue color components.
    Call ExtractRGBFromColor(ColorValue, Red, Green, Blue)

        Row = Row & ColorValue

    Next j
    txtCodeBinery.Text = txtCodeBinery.Text & Row & vbCrLf
    Row = ""
Next i

End Sub


همش اجرا می کنم تا دکمه رو می زنم هنگ می کنه؟

----------


## xxxxx_xxxxx

به این خاطر که حلقه ها طولانی هستند. شما به جای Height و Width مقادیر تقریبی کوچکتری قرار بدید و کمی صبور باشید.

همچنین می تونید توی بدنه حلقه خارجی از DoEvents استفاده کنید.

----------


## ehsanocx

اقا تا 100x100 پیکسل رو راحت نشون میده اما برای height  و width  عکس رو میدم به حلقه for  . هنگ می کنه . چون خیلی فرایتد محاسبه اش زیاد میشه باید چیکار کنم که این فرایند رو کاهش بدیم؟ تا برنامه هنگ نکنه و بتونه نمام پیکسل ها و نمایش بده ؟

----------


## xxxxx_xxxxx

توی بدنه حلقه خارجی بنویسید DoEvents. جایی که متغیر Row داره خالی میشه.

----------


## ehsanocx

ExtractRGBWithCopyMemory.zip

آقا اینو نگاه کن. من نمی دونم این  DoEvent  رو کجا قرار بدم. یه نگاه به کد بنداز. ببین پیشرفتم خوب بوده ؟

----------


## ehsanocx

chi. DoEvent
DoEvent.   مینویسم error  میده ؟ قبلش نیاید متغییری بنویسم؟ مثلا Rom.DoEvent

----------


## ehsanocx

Doevent  رو هم میزارم کمی سرعت نمایش پیکسل ها بهتر میشه اما در کل بازم جواب کار رو نمیده.  چرا باید از فایل  kernel32 استفاده کنه؟ به نظر شما بخاطر اینکه مقدار RGB  رو از این تابع فراخوانی میکنه اینقدر طول نمیکشه ؟ نمیشه اینو حذف کرد؟

به جای textbox  از richtextbox استفاده کنم بهتر نیست ؟  توی تکست باکس چقدر متن جا می گیره ؟

----------


## xxxxx_xxxxx

در مورد DoEvent*s*  شما حرف s آخر رو جا انداخته بودید.



> چرا باید از فایل  kernel32 استفاده کنه؟ به نظر شما بخاطر اینکه مقدار  RGB  رو از این تابع فراخوانی میکنه اینقدر طول نمیکشه ؟ نمیشه اینو حذف  کرد؟


بله، به خاطر اینکه داره از تابع CopyMemory برای بدست آوردن مقادیر RGB استفاده میکنه.
چرا، می تونید اینو حذف کنید و خودتون این مقادیر رو محاسبه کنید:
https://barnamenevis.org/showpo...34&postcount=1



> به جای textbox  از richtextbox استفاده کنم بهتر نیست ؟  توی تکست باکس چقدر متن جا می گیره ؟


فکر نمی کنم فرقی داشته باشه. تا اینجا که با TextBox به مشکلی برخورد نکردید.

----------


## ehsanocx

دوست من توی این تایپیک که تبدیل RGB  به Long  نیست که. این رو میزارم جواب نمی ده
Private Sub LngToRGB(LCul As Long, R As Byte, G As Byte, B As Byte)
   R = LCul And &HFF&
   G = (LCul And &HFF00&) \ &H100&
   B = (LCul And &HFF0000) \ &H10000
End Sub

باید چیکار کنم؟

----------

