Albus
Grünschnabel
Einen schönen Abend!
Ich habe ein kleines Programmchen in MFC gebastelt, welches ein bestimmtes Bild in verschiedenen Kanäle splittert.
hier die Funktion:
Das Problem ist nur, dass man sieht, wie die die 3 Kanäle (bilder) gezeichnet werden :
Wie kann man erst zeichnen, wenn die Schleife komplett durchlaufen ist? (so dass, das BIld gleich "komplett" angezeigt wird )
Noch eine Frage: Wenn ich das Fenster minimiere oder schiebe, verschwindet die Zeichnung. Was kann man dagegen tun?
Ich habe ein kleines Programmchen in MFC gebastelt, welches ein bestimmtes Bild in verschiedenen Kanäle splittert.
hier die Funktion:
Code:
CBitmap tempbmp;
CString fileName;
CFileDialog dlg(TRUE,NULL,NULL,OFN_ENABLESIZING|OFN_EXPLORER|OFN_FILEMUSTEXIST,
L"Bitmap(*.bmp)|*bmp||",this,0,TRUE);
if (dlg.DoModal() == IDOK)
{
fileName = dlg.GetPathName();
HBITMAP hBmp = (HBITMAP)::LoadImage(
NULL,
fileName,
IMAGE_BITMAP,
0,
0,
LR_LOADFROMFILE|LR_CREATEDIBSECTION
);
tempbmp.Attach(hBmp);
CClientDC dc(this);
CDC cDC;
cDC.CreateCompatibleDC(&dc);
CBitmap *pOldbmp = cDC.SelectObject(&tempbmp);
BITMAP bi;
tempbmp.GetBitmap(&bi);
dc.BitBlt(0,0,bi.bmWidth,bi.bmHeight,&cDC,0,0,SRCCOPY);
cDC.SelectObject(pOldbmp);
for (int i=0; i<bi.bmWidth; i++)
{
for (int j=0; j<bi.bmHeight; j++)
{
BYTE r,g,b,y,u,v;
COLORREF rgb= RGB(0,0,0);
rgb = dc.GetPixel(i,j);
r = GetRValue(rgb);
g = GetGValue(rgb);
b = GetBValue(rgb);
//y = 0,299*r +0,587*g +0,114*b; //alt
y = ( ( 66 * r + 129 * g + 25 * b + 128) >> 8) + 16;
u = ( ( -38 * r - 74 * g + 112 * b + 128) >> 8) + 128;
v = ( ( 112 * r - 94 * g - 18 * b + 128) >> 8) + 128;
/*
Y = ( ( 66 * R + 129 * G + 25 * B + 128) >> 8) + 16
U = ( ( -38 * R - 74 * G + 112 * B + 128) >> 8) + 128
V = ( ( 112 * R - 94 * G - 18 * B + 128) >> 8) + 128
C = Y - 16
D = U - 128
E = V - 128
R = clip(( 298 * C + 409 * E + 128) >> 8)
G = clip(( 298 * C - 100 * D - 208 * E + 128) >> 8)
B = clip(( 298 * C + 516 * D + 128) >> 8)
*/
dc.SetPixel(i+bi.bmWidth,j,RGB(y,y,y));
dc.SetPixel(i,j+bi.bmHeight,RGB(u,u,u));
dc.SetPixel(i+bi.bmWidth,j+bi.bmHeight,RGB(v,v,v));
}
}
}
else
{
}
Das Problem ist nur, dass man sieht, wie die die 3 Kanäle (bilder) gezeichnet werden :
Code:
for (int i=0; i<bi.bmWidth; i++)
{
for (int j=0; j<bi.bmHeight; j++)
{
BYTE r,g,b,y,u,v;
COLORREF rgb= RGB(0,0,0);
rgb = dc.GetPixel(i,j);
r = GetRValue(rgb);
g = GetGValue(rgb);
b = GetBValue(rgb);
//y = 0,299*r +0,587*g +0,114*b; //alt
y = ( ( 66 * r + 129 * g + 25 * b + 128) >> 8) + 16;
u = ( ( -38 * r - 74 * g + 112 * b + 128) >> 8) + 128;
v = ( ( 112 * r - 94 * g - 18 * b + 128) >> 8) + 128;
/*
Y = ( ( 66 * R + 129 * G + 25 * B + 128) >> 8) + 16
U = ( ( -38 * R - 74 * G + 112 * B + 128) >> 8) + 128
V = ( ( 112 * R - 94 * G - 18 * B + 128) >> 8) + 128
C = Y - 16
D = U - 128
E = V - 128
R = clip(( 298 * C + 409 * E + 128) >> 8)
G = clip(( 298 * C - 100 * D - 208 * E + 128) >> 8)
B = clip(( 298 * C + 516 * D + 128) >> 8)
*/
dc.SetPixel(i+bi.bmWidth,j,RGB(y,y,y)); // Hier wird es mit jedem Durchlauf gezeichnet :-(
dc.SetPixel(i,j+bi.bmHeight,RGB(u,u,u));
dc.SetPixel(i+bi.bmWidth,j+bi.bmHeight,RGB(v,v,v));
}
}
Wie kann man erst zeichnen, wenn die Schleife komplett durchlaufen ist? (so dass, das BIld gleich "komplett" angezeigt wird )
Noch eine Frage: Wenn ich das Fenster minimiere oder schiebe, verschwindet die Zeichnung. Was kann man dagegen tun?