سلام ،چگونه رنگ background تصوير را با زمينه ي فرم set كنم(mask)
من يك برنامه دارد كه مي خواهم چندين تصوير را روي هم قرار دهم ولي چون تصاوير من رنگ پيش زمينه دارند تصاوير زيري قابل مشاهده نيست.
با تشكر
سلام ،چگونه رنگ background تصوير را با زمينه ي فرم set كنم(mask)
من يك برنامه دارد كه مي خواهم چندين تصوير را روي هم قرار دهم ولي چون تصاوير من رنگ پيش زمينه دارند تصاوير زيري قابل مشاهده نيست.
با تشكر
سلام.
به سایت CodeProject یه سری بزنید من لینکش رو گذاشتم. لینک زیر در مورد تابع MaskBlt توضیح داده با این تابع می تونید پس زمینه تصاویرتون که با رنگ خاصی مشخص شدند رو حذف کنید. عضو سایت بشید تا بتونید Example هاش رو دانلود کنید.
http://www.codeproject.com/Articles/...nt-for-MaskBlt
من اينجا رفتم ولي چيزي سر در نياوردم !
اگر به زبان ساده منو راهنمايي كنيد ممنون ميشم.
بيشتر سورس كدها به زبان C# نوشته شده ولي من دنبال Mfc aplication هستم
سلام.
ابتدا باید چهار تصویر را بارگذاری کنید 1. تصویر پس زمینه 2. تصویر پیش زمینه 3. تصویر ماسک اول 4. تصویر ماسک دوم . بعد باید تصویر زمینه را با ماسک دوم OR کنید سپس تصویر پیش زمینه را با ماسک اول OR کنید در ادامه نتایج دو مرحله قبل را با هم AND می کنید در انتها هم تصویر را در DC مورد نظر کپی می کنید تا نمایش داده شود.
Mask.JPG
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);
از راهنمايي شما خيلي ممنونم. فقط يه سوال ديگه :
مقدار hdc را بايد از كجا بگيرم؟ و hInst چي هست؟و مقدار خودش را از كجا ميگيرد؟
برای 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 مقدار گرفته است.
خيلي متشكرم ،راهنمايي هاي شما خيلي مفيد بود خيلي از مشكلاتم رو حل كرد!