PDA

View Full Version : ساخت تصویر از لایه های مختلف



phantasm
پنج شنبه 24 مهر 1382, 11:50 صبح
سلام

در یه برنامه بعد از لایه برداری از یه تصویر و قراردادن هر لایه توی یه متغیر tbitmap واعمال تغیرات روی اونها لازمه که با استفاده از اون لایه ها تصویر نهایی ساخته بشه یعنی با توجه به اینکه (pixel(x,y توی کدوم لایه قرار داره, از روی همون متغیر tbitmap خونده بشه و در تصویر نهایی قرار بگیره.

یه راه انجام اینکار استفاده از یه آرایه برای هر متغیر tbitmap است که با توجه به مصرف زیاد حافظه مقرون به صرفه نیست :roll:

آیا کسی برای انجام این کار روشی داره؟؟

ممنون

phantasm
شنبه 26 مهر 1382, 20:50 عصر
سلام

من یکم توی help دلفی گشتم تابع MaskBlt رو پیدا کردم و با توجه به توضیحش فکرکنم بشه ازش در این مورد استفاده کرد



BOOL MaskBlt(

HDC hdcDest, // handle of destination device context
int nXDest, // x-coord. of upper-left corner of destination rectangle
int nYDest, // y-coord. of upper-left corner of destination rectangle
int nWidth, // width of source and destination rectangles
int nHeight, // height of source and destination rectangles
HDC hdcSrc, // handle of source device context
int nXSrc, // x-coord. of upper-left corner of source rectangle
int nYSrc, // y-coord. of upper-left corner of source rectangle
HBITMAP hbmMask, // handle of monochrome bit mask
int xMask, // horizontal pixel offset into the mask bitmap
int yMask, // vertical pixel offset into the mask bitmap
DWORD dwRop // raster operation code
);

اما الان چندتا چیز در مورد این تابع برام نا مشخصه
hdcDest و hdcSrc و hbmMask و dwRop رو چطو میتونم بدست بیارم :oops:
اگه ممکنه یکم در مورد device context هم توضیح بدید :wink:

متشکرم
ـ-ـ-ـ-ـ-ـ-ـ-ـ-ـ-ـ-ـ-ـ-ـ-ـ-ـ-ـ-
phantasm

Sohrab_Tapar
شنبه 26 مهر 1382, 21:41 عصر
از MATLAB استفاده کن.
(imread,imwriite,bitget)

said ali
سه شنبه 29 مهر 1382, 17:34 عصر
با سلام
چرا اینقدر کار رو سخت میکنی. :roll: :roll:
تمام لایه ها رو روی یه فرم قرار بده بعد هم Canvas فرم رو بریز توی بیتمپ والسلام.

phantasm
سه شنبه 29 مهر 1382, 17:48 عصر
سلام

چطوری تمام لایه ها رو توی یه فرم قرار بدم؟؟؟ :oops:

said ali
چهارشنبه 30 مهر 1382, 11:25 صبح
با سلام
فکر کنم بد متوجه شدم و گرنه منظورم از لای ها معلومه یه ایمیج دیگه. :roll: :roll:

phantasm
چهارشنبه 30 مهر 1382, 12:21 عصر
شاید من درست عنوان نکردم
کاری که من میخوام انجام بدم اینه که روی تصویر یه فیلتر بزارم (مثه فیلتر های photoshop) و در این فیلتر گذاری هر رنگ خاص باید طی مراحلی فیلترگذاری بشه که فقط منحصر به همون رنگه(شاید اینجا هم شما بگید خوب این که آسونه چون با یه if میشه اون رنگ رو بدست آورد بعد عملیات خاص رو روی اون انجام داد .در این صورت باید بگم چون فیلتر روی مجموعه رنگها باید انجام بشه و با یکی دوتا pixel نمیشه کاری کرد)
برای همین من فکر کردم اول چندتا تصویر بسازم که توی هر کدوم فقط اون پیکسلهایی هست که رنگشون یکسانه(من به این میگم یه لایه)بعد
کار رو روی این لایه ها انجام بدم ولی در اخر همه این لایه ها باید با هم ترکیب بشن تا تصویر نهایی بدست بیاد.

امیدوارم خوب بیان کرده باشم :wink:

Behzad_Asharkhan
پنج شنبه 01 آبان 1382, 09:47 صبح
سلام

آیا داری برای چاپ روی کاغذ یا پارچه رنگها رو تفکیک میکنی؟
آیا اون کاری که روی یک لایه تک رنگ انجام میدی رنگ جدیدی هم ایجاد میشه یا فقط شکل چیده شدن پیکسل ها عوض میشه؟
آیا اون لایه رنگی " فقط یک رنگ" مثلا برای آبی شامل یک RGB ثابته یا شامل یک محدوده از رنگ آبیه؟
آیا تعداد لایه ها محدوده؟

من فرض میکنم این کار برای یه خروجی چاپی انجام میشه تعداد لایه ها محدود و تعداد رنگ هر لایه هم یکه. تعداد لایه ها هم میتونه 3 یا 4 یا همین حدودا باشه.
میتونی 24 بیت رو به 3 یا 4 یا 6 قسمت مساوی تقسیم کنی که هر قسمت مربوط به یه رنگ خاص باشه. و تو هم تداخل نداشته باشن. و تو هر لایه هم هر عملیاتی انجام میشه نتیجه نباید از محدوده بیتهای مجاز اون لایه خارج شه. اگه اینطوری کار کنی تصویر اصلی خروجی با OR کردن پیکسلهای لایه ها بدست میاد.
برای اینکه رنگ هر لایه به چند بیت که تو هر لایه مشخص کردی محدود بشه مجبور نیستی در هر لایه با رنگ اصلی کار کنی و میتونی یه Lookup table داشته باشی و بعدا رنگها رو جابجا کنی.
سوالت کمی گنگه. مثلا توضیح ندادی خودت چطوری و بر چه اساسی رنگها رو تفکیک کردی که حالا موقع ترکیب کردن به مشکل خوردی.

موفق باشی.

phantasm
پنج شنبه 01 آبان 1382, 11:15 صبح
دوست عزیز سلام

کار برنامه ایجاد تصویر خروجی برای چاپ تصاویر در چاپخانه(مثلا برای یه کتاب)است.
در حقیقت برنامه اول تصویر رو بصورت سیاه سفید در میاره(monochorome) ولی اگه این تصویر بخواد چاپ بشه کیفیت خوبی نخواهد داشت(لطفا دلیلش رو نپرسید چون خودم هم نمیدونم چرا اینجوریه... :wink: فرض رو بر این میزاریم که دستگاههای چاپ ماله عهد بوقن :mrgreen: )برای همین لازمه که این تصویر فقط از دو رنگ سیاه$00000000 و سفید $ffffffff ساخته بشه و تنها راه برای این امر هم همونیه که در بالا گفتم.
یعنی از یه محدوده رنگ(مثلا سفید تا خاکستری کم رنگ)نمونه برداری میشه و اون رو با ترکیب فقط دو رنگ سیاه و سفید میسازم (یعنی در حقیقت پراکندگی رنگ سیاه رو به قدری زیاد میکنیم که رنک معادلش در تصویر اولیه بدست بیاد)
وقتی به این صورت عمل میشه ممکنه تا 20 تا لایه هم ایجاد بشه برای همین روشی که خودم اول بهش اشاره کردم به صرفه نیست(یعنی برنامه از اول تا آخر تصویر pixel ها رو چک کنه ببینه آیا اون pixel در لایه ای برابر رنگ سیاه هست یا نه تا اون رو در تصویر نهایی قرار بده :( )

من میخوام در آخر همه لایه ها روی هم map (نگاشت)بشن.


ممنون.

Behzad_Asharkhan
شنبه 03 آبان 1382, 11:52 صبح
سلام

من قبلا شبیه این کارو انجام دادم. یه تصویر اسکن شده (یا هرچیز دیگه) داری که پالت رنگ Grayscale داره و باید اونو Black and white کنی که قطعا خراب میشه. پس باید از روش Half Tone استفاده کنی ( همون کاری که fax موقع ارسال تصویر انجام میده ) فکر کنم شما هم همین کارو کردی برای ساختن خاکستری های مختلف باید از تراکم متفاوت نقطه های سیاه استفاده بشه.
پس باید هر رنگ خاکستری رو تو یه تصویر جدا بکشی و متناسب با شدت تیرگی یه Pattern سیاه و سفید درست کنی و بجای رنگ خاکستری قرار بدی. حالا میخوای این لایه ها که هر کدوم نماینده یه نوع خاکستری هستند رو با هم جمع کنی توی یه تصویر. ( همین کارو کردی؟ اگر نه توضیح بده )

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

Behzad_Asharkhan
شنبه 03 آبان 1382, 12:01 عصر
ببخشید زود ارسال کردم. فکر کنم تا اینجاش خودت انجام دادی
اگه تو هر لایه با رنگ invert شده کار کنی به جای سفید. رنگ سیاه و بجای سیاه سفید گذاشته باشی. بجای اون دستور IF گنده و وقت گیر میتونی ارزش هر نقطه رو با OR لایه ها بدست بیاری اگه صفر شد اون نقطه باید سفید شه .و اگه FFFFFF شد سیاه. ( چون قبلا INVERT شده بود )

phantasm
شنبه 03 آبان 1382, 12:09 عصر
سلام

آقای Behzad_Asharkhan بله منم توضیح دادم که چیکار کردم. :wink:


اگر این کارو کرده باشی اگر یه پیکسل خاص رو تو همه لایه ها بررسی کنی حداکثر یه نقطه سیاه پیدا میشه. پس برای ساخت تصویر نهایی هر نقطه باید این نقطه در همه لایه ها بررسی بشه و اگه همه سفید بود ایجا هم سفید و اگه یه سیاه پیدا شد این نقطه باید سیاه بشه.
خودمم هم از همون اول به این مسیله واقف بودم.یه نگاهی به پستای قبلی بندازید :mrgreen:
اما میخوام بدونم غیر از این راه دیگه ای وجود نداره :oops: چون وقتی لایه ها زیاد باشه حجم عملیات بشدت بالا میره!!!

ضمنا از توجهتون به موضوع ممنونم :wink:

Behzad_Asharkhan
شنبه 03 آبان 1382, 12:15 عصر
:( اینکه گفتم خودم تو دلفی تست کردم با Invert کردن کمی سریعتر شد ولی بازم خیلی کنده. احتمالا به درد نمیخوره ( تو دلفی بجای OR باید + استفاده کنی) همین روش با سی خیلی سریعتر اجرا میشه نمیدونم چرا تو دلفی کنده. :(

said ali
شنبه 03 آبان 1382, 16:04 عصر
با سلام
من که اخر نفهمیدم چی شد از بس مینویسید .
اگه میخوای یه تصویر داشته باشی که فقط گرادینت خاکستری باشه یعنی از سفید شروع بشه و به سیاه ختم بشه که این کار رو ACDSee راحت انجام میده اگه میخوای خودت هم انجام بدی فقط کافی با دستور pixels رنگ نقاط رو بگیری و تبدیل به RGB کنی و بعد به جای اون رنگ از رنگ R+G+B/3 استفاده کنی که خیلی کار راحتیه. البته من هنوز هم نفهمیدم چی میخوای ولی در هر صورت استفاده از اون همه لایه کاریست بس عجیب و نامعقول که بابای کامپیوتر :mrgreen: رو با اون حلق ها در میاره البته ببخشید این جوری میگم ولی چه کنم نمیفهمم .... :shock: :shock: :shock: :!: :!: :!: