PDA

View Full Version : سوال: set كردن رنگ background تصوير با زمينه ي فرم



noshin156
یک شنبه 27 فروردین 1391, 12:12 عصر
سلام ،چگونه رنگ background تصوير را با زمينه ي فرم set كنم(mask)
من يك برنامه دارد كه مي خواهم چندين تصوير را روي هم قرار دهم ولي چون تصاوير من رنگ پيش زمينه دارند تصاوير زيري قابل مشاهده نيست.
با تشكر

ASGGSA
سه شنبه 29 فروردین 1391, 11:43 صبح
سلام.
به سایت CodeProject یه سری بزنید من لینکش رو گذاشتم. لینک زیر در مورد تابع MaskBlt توضیح داده با این تابع می تونید پس زمینه تصاویرتون که با رنگ خاصی مشخص شدند رو حذف کنید. عضو سایت بشید تا بتونید Example هاش رو دانلود کنید.
http://www.codeproject.com/Articles/931/A-replacement-for-MaskBlt

noshin156
سه شنبه 29 فروردین 1391, 12:43 عصر
من اينجا رفتم ولي چيزي سر در نياوردم !
اگر به زبان ساده منو راهنمايي كنيد ممنون ميشم.
بيشتر سورس كدها به زبان c# نوشته شده ولي من دنبال Mfc aplication هستم

ASGGSA
چهارشنبه 30 فروردین 1391, 10:51 صبح
سلام.
ابتدا باید چهار تصویر را بارگذاری کنید 1. تصویر پس زمینه 2. تصویر پیش زمینه 3. تصویر ماسک اول 4. تصویر ماسک دوم . بعد باید تصویر زمینه را با ماسک دوم OR کنید سپس تصویر پیش زمینه را با ماسک اول OR کنید در ادامه نتایج دو مرحله قبل را با هم AND می کنید در انتها هم تصویر را در DC مورد نظر کپی می کنید تا نمایش داده شود.
85911


HDC hdcBack, hdcFore, hdcMask1, hdcMask2;
HBITMAP hbmBack1,hbmBack2,hbmFor1,hbmFor2,hbmMask1_1,hbmMa sk1_2,hbmMask2_1,hbmMask2_2;
hdcBack = CreateCompatibleDC(hdc);
hdcFore = CreateCompatibleDC(hdc);
hdcMask1 = CreateCompatibleDC(hdc);
hdcMask2 = CreateCompatibleDC(hdc);

hbmBack1 = LoadBitmap(hInst, MAKEINTRESOURCE(IDB_Background));
hbmBack2 = (HBITMAP)SelectObject(hdcBack, hbmBack1);
hbmFor1 = LoadBitmap(hInst, MAKEINTRESOURCE(IDB_Foreground));
hbmFor2 = (HBITMAP)SelectObject(hdcFore, hbmFor1);
hbmMask1_1 = LoadBitmap(hInst, MAKEINTRESOURCE(IDB_Mask1));
hbmMask1_2 = (HBITMAP)SelectObject(hdcMask1, hbmMask1_1);
hbmMask2_1 = LoadBitmap(hInst, MAKEINTRESOURCE(IDB_Mask2));
hbmMask2_2 = (HBITMAP)SelectObject(hdcMask2, hbmMask2_1);
BitBlt(hdcBack,0,0,89, 53, hdcMask2,0,0, SRCPAINT);
BitBlt(hdcFore,0,0,89, 53, hdcMask1,0,0, SRCPAINT);
BitBlt(hdcBack,0,0,89, 53, hdcFore,0,0, SRCAND);
BitBlt(hdc,0,0,132, 72, hdcBack,0,0, SRCCOPY);
DeleteObject(hbmBack1);
DeleteObject(hbmBack2);
DeleteObject(hbmFor1);
DeleteObject(hbmFor2);
DeleteObject(hbmMask1_1);
DeleteObject(hbmMask1_2);
DeleteObject(hbmMask2_1);
DeleteObject(hbmMask2_2);
DeleteDC(hdcFore);
DeleteDC(hdcBack);
DeleteDC(hdcMask1);
DeleteDC(hdcMask2);

noshin156
چهارشنبه 30 فروردین 1391, 13:56 عصر
از راهنمايي شما خيلي ممنونم. فقط يه سوال ديگه :
مقدار hdc را بايد از كجا بگيرم؟ و hInst چي هست؟و مقدار خودش را از كجا ميگيرد؟

ASGGSA
چهارشنبه 30 فروردین 1391, 16:49 عصر
برای HDC در Win32 :

HDC = hdc;
hdc =GetDC(hWnd)

یا

HDC = hdc;
PAINTSTRUCT ps;
hdc = BeginPaint(hWnd, &ps);

اگر با MFC کار می کنید :

CClientDC dc(this);
//بطور مثال
dc.BitBlt(0,0,132, 72, hdcBack,0,0, SRCCOPY);

برای hInst یا hInstance این ساختمان نمونه ی دستگیره برنامه را در خود دارد.
برای گرفتن نمونه جاری برنامه در MFC از تابع AfxGetInstanceHandle استفاده کنید.
بطور مثال :

LoadBitmap(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDB_BITMAP1));

در Win32---hInst در تابع InitInstance مقدار گرفته است.

noshin156
شنبه 02 اردیبهشت 1391, 12:58 عصر
خيلي متشكرم ،راهنمايي هاي شما خيلي مفيد بود خيلي از مشكلاتم رو حل كرد!