PDA

View Full Version : تغییر رنگ تصویر



سپهر-111
چهارشنبه 25 بهمن 1391, 16:05 عصر
سلام دوستان و اساتید بزرگ
(البته قبلش بگم که جستجو کردم ولی جواب مناسبی برای سوالم پیدا نکردم!)


من یک تصویربا فرمت PNG ، تک رنگ دارم (مثل تصویر زیر) حالا میخوام با کد نویسی رنگشو تغییر بدم

با چه کدی میتوان انجام داد؟(البته نمیخوام CPU درگیر بشه !)

ممنون میشم راهنمایی بفرمایید

باتشکر از حسن توجه دوستان
100005

mehran901
چهارشنبه 25 بهمن 1391, 17:30 عصر
بنده ی پیشنهاد دارم ، (البته وقتی پی ان جی نباشه به درد میخوره ) من قبلا این کارو واسهفرمت jpg انجام دادم ، ی کلاس سابق داشتم واسه تبدیل فرمت عکس ها که متاسفانه پیداش نکردم ( اگه کسی داره بذاره همگی دعاش میکنیم ! :D )

اول تبدیل فرمت بزنین بعدش با api ، getpixel یا پروسیجر point picturebox ( من از دومی استفاده کردم ) شروع به خوندن پیکس ها بکنید و با ی برنامه ساده (محاسبش الان یادم رفته ولی سورس رو از روی اون محاسبه نوشتم ) بعد از به دست آوردن RGb هر نقطه ( که چون عکس تکرنگه همش مثل همه ) یک مقداری رو ازش کم کنید یازیاد کنید تا به رنگ خواص خودتون برسید مثلا rgb(255,0,0) مشخصه که قرمزه و با کم کردن rgb(255-255,0,0) رنگش مشکی میشه ... حالا رنگ مورد نظر جدید را با مختصات پیکسلی که خوندین روی hِDc ی پیکچر باکس جدید ست کنین ( با تابع setpixel ) .... خیلی ساده رنگش رو میشه عوض کرد

ی مثال هم واسه تبدیل خروجی رنگ point به rgb نوشتم به شکل زیر :

Private Type colortype
red As Long
green As Long
blue As Long

End Type
Dim a As colortype

داخل استراکچر بالا r g b ما ذخیره خواهد شد

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(x1.point(x,y))
msgbox a.red

ی مثال واسه متوجه شدن rgb پیکسل ها در picturebox


راستی من حواسم نبود نوشتی بدون درگیر شدن cpu کار انجام بشه ... خب سی پی یو درگیر نشه ؟! بدنه کیس درگیر بشه پس ؟ :D

سپهر-111
چهارشنبه 25 بهمن 1391, 17:45 عصر
بنده ی پیشنهاد دارم ، (البته وقتی پی ان جی نباشه به درد میخوره ) من قبلا این کارو واسهفرمت jpg انجام دادم ، ی کلاس سابق داشتم واسه تبدیل فرمت عکس ها که متاسفانه پیداش نکردم ( اگه کسی داره بذاره همگی دعاش میکنیم ! :D )

اول تبدیل فرمت بزنین بعدش با api ، getpixel یا پروسیجر point picturebox ( من از دومی استفاده کردم ) شروع به خوندن پیکس ها بکنید و با ی برنامه ساده (محاسبش الان یادم رفته ولی سورس رو از روی اون محاسبه نوشتم ) بعد از به دست آوردن RGb هر نقطه ( که چون عکس تکرنگه همش مثل همه ) یک مقداری رو ازش کم کنید یازیاد کنید تا به رنگ خواص خودتون برسید مثلا rgb(255,0,0) مشخصه که قرمزه و با کم کردن rgb(255-255,0,0) رنگش مشکی میشه ... حالا رنگ مورد نظر جدید را با مختصات پیکسلی که خوندین روی hِDc ی پیکچر باکس جدید ست کنین ( با تابع setpixel ) .... خیلی ساده رنگش رو میشه عوض کرد

ی مثال هم واسه تبدیل خروجی رنگ point به rgb نوشتم به شکل زیر :

Private Type colortype
red As Long
green As Long
blue As Long

End Type
Dim a As colortype

داخل استراکچر بالا r g b ما ذخیره خواهد شد

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(x1.point(x,y))
msgbox a.red

ی مثال واسه متوجه شدن rgb پیکسل ها در picturebox


راستی من حواسم نبود نوشتی بدون درگیر شدن cpu کار انجام بشه ... خب سی پی یو درگیر نشه ؟! بدنه کیس درگیر بشه پس ؟ :D


سلام جناب مهران
باتشکر از این که وقت گذاشتید و جواب دادید
در واقع من میخوام توی یک تابع که دائما در حال تکرار هستش به وسیله تغییر رنگ یک شئ ، کارکرد اون روال نشون بدم ، البته اینطور که شما فرمودین و من متوجه شدم تقریبا باید با حلقه فور تک تک پیکسلها رو رنگشو عوض کنم (البته فکر کنم راه دیگه ای هم نباشه) واینجوری باعث میشه یه خورده زمان پردازش برنامه بره بالا(البته خیلی کم ولی باز همون هم برام مهمه)
فکر میکنم بهترین کار که نیاز به پردازش هم نداشته باشه و سریع باشه استفاده از دوتا تصویر هم سایز و با رنگ متفاوت که قبلا اماده شده ، برای منظور مورد نظر مناسب هست تا اینکه بخوام رنگ عوض کنم

mehran901
چهارشنبه 25 بهمن 1391, 17:52 عصر
بله خب ، اگه فقط رنگ های مشخصی مد نظرتون باشه همون که خودتون فرمودین راه مناسبی هست ، البته ی api دیگه هم بود واسه کپی زدن پیکسل ها ، یکم سرعتش بیشتر بود ، الان اسمش یادم نیست متاسفانه ،
بله با حلقه For ، خیلی ساده می تونید پیکسل ها رو ست کنین فقط doevents رو از قلم نندازین که مرتب باید شاهد هنگ کردن برنامتون باشین!

ی کار دیگه هم میتونید انجام بدین ... ی ماتریس از عکستون ( به وسیله ی آرایه3 بعدی ) تشکیل بدین و اگه خواستین رنگ ها رو تغییر بدین ، یک محاسبه روی کل ماتریس اعمال کنین و بعدش با Setpixel در مختصات مناسب ، کل ماتریس ( شامل عکس تغییررنگ داده شده ) ست کنین ،

موفق باشین دوست عزیز

SlowCode
چهارشنبه 25 بهمن 1391, 22:03 عصر
سلام
شما میتونی با تابع BitBit این کار رو بکنی.
یکم درموردش تحقیق کن. سرعتش خیلی بیشتر از اینه که پیکسل ها رو یکی یکی بخونی و ...