دسترسی به پیکسل های فرم

abasfar

Member
سلام من میخوام به پیکسلهای فرم c# دسترسی داشته باشم
چون یک شکل کشیدم حالا میخوام اونا با اضافه کردن هدر به صورت bmp ذخیره کنم
 

the_king

مدیرکل انجمن
سلام من میخوام به پیکسلهای فرم c# دسترسی داشته باشم
چون یک شکل کشیدم حالا میخوام اونا با اضافه کردن هدر به صورت bmp ذخیره کنم

شما می توانید یک حافظه bitmap ایجاد کنید، یک عکس از صفحه فرم گرفته و در اون bitmap کپی کنید
و بعد با توابعی مثل (bitmap.GetPixel(x,y رنگ نقاط اون رو بخونید.

مثلا با کد زیر حافظه bitmap ای ایجاد می کنیم و تصویر فرم فعلی را در آن قرار می دهیم :
کد:
            Graphics myGraphics = this.CreateGraphics();
            Bitmap bitmap = new Bitmap(ClientSize.Width, ClientSize.Height, myGraphics);
            Graphics memoryGraphics = Graphics.FromImage(bitmap);
            Point point = PointToScreen(new Point(0, 0));
            Application.DoEvents();
            memoryGraphics.CopyFromScreen(point.X, point.Y, 0, 0, ClientSize);

و مثلا رنگ نقطه (0,0) را بخوانید :
کد:
Color c = bitmap.GetPixel(0, 0);

حتی می توانید آن bitmap را به یک image تبدیل کرده تا در یک PictureBox ذخیره کرده و یا در فایلی Save کنید.
کد:
            Image image = (Image)bitmap;
 

abasfar

Member
ممنون فقط میشه یک روش دیگه هم بگید من میخوام مثلا باشی دیگه مثل graphic دسترسی پیدا کنم
 

the_king

مدیرکل انجمن
ممنون فقط میشه یک روش دیگه هم بگید من میخوام مثلا باشی دیگه مثل graphic دسترسی پیدا کنم

شما یک نگاهی به توابع و متد های کلاس Graphics بندازید، ببینید بجز رسم گرافیکی چیزی داره که بخواهید رنگ
نقطه ای رو بخونید، نداره که. هر نوع کلاس ای قابلیت ها و خواص مربوط به خودش رو داره، GetPixel جزئی از
کلاس Bitmap است که یک حافظه تصویری است، تو کلاس های دیگه که همچین چیزی وجود نداره.

Image هم داخلش یک Bitmap وجود داره که البته مستقیما قابل دسترسی نیست و باید ابتدا به Bitmap تبدیل بشه.

Graphics حافظه Bitmap نداره که رنگ نقطه هاشو بخوانید، Graphics به یک Device Context
متصل میشه تا بتونه انواع ترسیم های گرافیکی رو رویش انجام بده، خودش حافظه تصویری نداره.
 

abasfar

Member
ممنون از جواب شما اما من میخواستم رنگ نکته نکته فرم را بدست بیارم و بعدش هدر را اضافه کننم و بعد خودم bmp را بسازم
که با این روش نشد بازم ممنون
 

the_king

مدیرکل انجمن
ممنون از جواب شما اما من میخواستم رنگ نکته نکته فرم را بدست بیارم و بعدش هدر را اضافه کننم و بعد خودم bmp را بسازم
که با این روش نشد بازم ممنون

شما می توانید از همون روشی که قبلا نوشتم رنگ هر نقطه یا نقاطی رو روی فرم بدست بیاورید، بعد هم جداول
BITMAPFILEHEADER و BITMAPINFOHEADER (یا BITMAP) رو در فایل بنویسید و در انتها داده نقاط بدست آمده رو
هم به فایل اضافه کنید.

دو تا پیشنهاد دارم :
1) یا بعد از ایجاد کردن bitmap از دو حلقه تو در توی for (یکی برای x و یکی برای y) همان تابع ()GetPixel استفاده کنید.
2) یا بعد از ایجاد کردن bitmap کل نقاط رو یکجا داخل یک آرایه انتقال بدهید. برای اینکار هم تابع ()LockBits و پارامتر Scan0
موجود در کلاس Bitmap بکار میره.

فقط یادتون باشه که در تصاویر BMP داده پیکسل ها پایین به بالا درج میشه، نه بالا به پایین. و همچنین طول داده های
هر سطر (بر حسب بایت) باید مضربی از 4 باشه، اگر در چنین نبود باید با اضافه کردن بایت های 0 اضافی مضربی از
4 بشه. یعنی فرضا اگه هر پیکسل 3 بایت RGB باشه و در هر سطر 7 پیکسل داشته باشیم، 3 * 7 بایت میشه 21
که مضربی از 4 نیست، پس در انتهای داده های هر سطر 3 بایت اضافه درج می کنیم تا طول هر سطر بر حسب بایت
24 بشه.

ساده ترین کار اینه که بجای فرمت RGB سه بایتی از RGBA چهار بایتی استفاده کنید، اینطوری هر پیکسل 4 بایت
طول داره و همیشه طول داده های هر سطر مضربی از 4 خواهد بود و نیازی به هیچ بایت اضافی نیست.
 

جدیدترین ارسال ها

بالا