لطفا از تگ code که با علامت # مشخص شده است استفاده کنید تا کدها قابل خواندن باشد.
در تاپیک قبلی که ارسال کردید چند نمونه لینک معرفی کردم که جهت نمایش عکس بود، احتمالا بررسی نکردید!
برای نمایش یک عکس می توانید به شکل زیر عمل کنید:
void CMFC_t1View::OnDraw(CDC* pDC)
{
CMFC_t1Doc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
HBITMAP hBmp = (HBITMAP)::LoadImage(NULL,L"C:\\pic.bmp",
IMAGE_BITMAP,0,0,
LR_LOADFROMFILE|LR_CREATEDIBSECTION);
CBitmap bmp;
bmp.Attach(hBmp);
// Get the size of the bitmap
BITMAP bmpInfo;
bmp.GetBitmap(&bmpInfo);
CDC dcMemory;
dcMemory.CreateCompatibleDC(pDC);
// Select the bitmap into the in-memory DC
CBitmap* pOldBitmap = dcMemory.SelectObject(&bmp);
pDC->BitBlt(0, 0, bmpInfo.bmWidth, bmpInfo.bmHeight, &dcMemory,
0, 0, SRCCOPY);
//------------
// Here write your getpixel codes
COLORREF color = dcMemory.GetPixel(450,500);
// if (color == 0) ... else ....
//------------
dcMemory.SelectObject(pOldBitmap);
}
- اگر خواستید که عکس در پنجره نمایش داده نشود و فقط اطلاعات bmp را دریافت کنید، فراخوانی تابع BitBlt را حذف کنید.
- در خط بعد از آن قبل از SelectObject بعدی می توانید با GetPixel که در فوق مثال زده ام به راحتی با مختصات پیکسل مورد نظر در حافظه dcMemory ،اطلاعات را دریافت کنید.
مثلا در خط بعدی آن همان فایل data.txt را باز کنید و با یک شرط که اگر color دریافتی مقدار 0 بود آنگاه همان صفر، اگر هم غیر صفر بود عدد 1 در فایل ذخیره شود.(برای عکس های سیاه و سفید)
برای عکس های رنگی هم خودتان باید قانونی به همین شکل بنویسید.
- ضمنا برای افزایش کارآیی اگر نمی خواهید عکس نمایش داده شود می توانید کدها را در OnInitDialog یا سایر قسمت ها که معمولا یک مرتبه فراخوانی می شوند مانند زمانی که کلید زده می شود فراخوانی کنید.