|
I wrote a code look like this to use in my little work. Its duty is
1. Load BMP image as resource by LoadBitmap function (4 images)
2. Shows one image on screen
3. Make some change by using the images
4. Show result
Every thing works well(But it is very slow when run). However after I changed the code by adding WriteDIB() (I want to save the result image into file) and compiled it, it can perform on its duty except for sainge the file(there is notthing happen). The program still run without any error.
////////////////////////////////////////////////////////////////////
// Invert.cpp
#include <afxwin.h>
#include <math.h>
#include "resource.h"
struct pixel{
public: // datamembers
BYTE red, green, blue;
};
class CMyWinApp : public CWinApp
{
public:
virtual BOOL InitInstance();
};
class CMyFrameWnd : public CFrameWnd
{
private:
CBitmap m_bmSource0D, m_bmSource4D, m_bmSource8D, m_bmSource12D, m_bmSourceMask;
CDC m_dcSource0D, m_dcSource4D, m_dcSource8D, m_dcSource12D, m_dcSourceMask;
CDC m_dcOffScreen;
BITMAP m_bmp;
COLORREF m_crC0D, m_crC4D, m_crC8D, m_crC12D, m_crCMask, m_crCOut; // Pixel Color
BYTE m_nR; // Red
BYTE m_nG; // Green
BYTE m_nB; // Blue
int Id, Id1, Id2, Id3, Id4;
int m_nX;
int m_nY;
double phi;
public:
CBitmap m_bmOffScreen;
public:
BOOL WriteDIB(HBITMAP hBitmap);
double FindArctan2Reverse(double upper, double lower);
double FindArctan2(double upper, double lower);
double FindArctan(double upper, double lower);
double checkdirection(double direct);
CMyFrameWnd();
afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
afx_msg void OnPaint();
afx_msg void OnLButtonUp(UINT nFlags, CPoint point);
afx_msg void OnRButtonUp(UINT nFlags, CPoint point);
DECLARE_MESSAGE_MAP()
};
BEGIN_MESSAGE_MAP(CMyFrameWnd, CFrameWnd)
ON_WM_CREATE()
ON_WM_PAINT()
ON_WM_LBUTTONUP()
END_MESSAGE_MAP()
BOOL CMyWinApp::InitInstance()
{
m_pMainWnd = new CMyFrameWnd();
m_pMainWnd->ShowWindow(SW_MAXIMIZE);
m_pMainWnd->UpdateWindow();
return TRUE;
}
CMyFrameWnd::CMyFrameWnd()
{
Create(NULL, "Invert", WS_POPUPWINDOW | WS_CAPTION, CRect(0, 0, 512, 480));
CenterWindow(NULL);
}
afx_msg int CMyFrameWnd::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
CPaintDC dc(this);
// Source0D
m_bmSource0D.LoadBitmap(IDB_BITMAP0D);
m_dcSource0D.CreateCompatibleDC(&dc);
m_dcSource0D.SelectObject(&m_bmSource0D);
// Source4D
m_bmSource4D.LoadBitmap(IDB_BITMAP4D);
m_dcSource4D.CreateCompatibleDC(&dc);
m_dcSource4D.SelectObject(&m_bmSource4D);
// Source8D
m_bmSource8D.LoadBitmap(IDB_BITMAP8D);
m_dcSource8D.CreateCompatibleDC(&dc);
m_dcSource8D.SelectObject(&m_bmSource8D);
// Source12D
m_bmSource12D.LoadBitmap(IDB_BITMAP12D);
m_dcSource12D.CreateCompatibleDC(&dc);
m_dcSource12D.SelectObject(&m_bmSource12D);
// SourceMask
m_bmSourceMask.LoadBitmap(IDB_BITMAPMASK);
m_dcSourceMask.CreateCompatibleDC(&dc);
m_dcSourceMask.SelectObject(&m_bmSourceMask);
// Off-Screen
m_bmOffScreen.LoadBitmap(IDB_BITMAP0D);
m_dcOffScreen.CreateCompatibleDC(&dc);
m_dcOffScreen.SelectObject(m_bmOffScreen);
m_bmSource0D.GetBitmap(&m_bmp);
return 0;
}
afx_msg void CMyFrameWnd::OnPaint()
{
CPaintDC dc(this);
dc.BitBlt(0, 0, m_bmp.bmWidth, m_bmp.bmHeight, &m_dcOffScreen, 0, 0, SRCCOPY);
}
afx_msg void CMyFrameWnd::OnLButtonUp(UINT nFlags, CPoint point)
{
const double pi = 3.1416;
for (m_nY = 0; m_nY < m_bmp.bmHeight; m_nY++)
{
for (m_nX = 0; m_nX < m_bmp.bmWidth; m_nX++)
{
if(m_crCMask = m_dcSourceMask.GetPixel(m_nX, m_nY) == 0x000000)
{
m_nR = 0x62;
m_nG = 0x6E;
m_nB = 0x69;
m_crCOut = m_nR + (m_nG << 8) + (m_nB << 16);
m_dcOffScreen.SetPixel(m_nX, m_nY, m_crCOut);
}
else
{
m_crC0D = m_dcSource0D.GetPixel(m_nX, m_nY);
m_crC4D = m_dcSource4D.GetPixel(m_nX, m_nY);
m_crC8D = m_dcSource8D.GetPixel(m_nX, m_nY);
m_crC12D = m_dcSource12D.GetPixel(m_nX, m_nY);
Id1 = GetBValue(m_crC0D);
Id2 = GetBValue(m_crC4D);
Id3 = GetBValue(m_crC8D);
Id4 = GetBValue(m_crC12D);
double numerator = Id1 - Id3;
double denominator = Id2 - Id4;
phi = (pi/8) - 0.25 * FindArctan(numerator, denominator);
checkdirection(phi);
int m_nConvertToGrayScale = (int)((phi * 500 / pi) + 0.5);
if(m_nConvertToGrayScale > 255) m_nConvertToGrayScale = 255;
if(m_nConvertToGrayScale < 0) m_nConvertToGrayScale = 0;
m_nR = m_nConvertToGrayScale;
m_nG = m_nConvertToGrayScale;
m_nB = m_nConvertToGrayScale;
m_crCOut = m_nR + (m_nG << 8) + (m_nB << 16);
m_dcOffScreen.SetPixel(m_nX, m_nY, m_crCOut);
}
}
}
m_dcSource0D.BitBlt(0, 0, m_bmp.bmWidth, m_bmp.bmHeight, &m_dcOffScreen, 0, 0, SRCCOPY);
RedrawWindow(NULL, NULL, RDW_INVALIDATE);
}
CMyWinApp MyWinApp;
double CMyFrameWnd::checkdirection(double direct)
{
const double pi = 3.1416;
if(Id3 < Id1 && Id3 < Id2 && Id3 < Id4)
{
if(Id4 < Id2)
direct = direct + (pi / 4);
}
else if(Id4 < Id1 && Id4 < Id2 && Id4 < Id3)
{
direct = direct + (pi / 4);
}
else
{
direct = direct;
}
return direct;
}
double CMyFrameWnd::FindArctan(double upper, double lower)
{
double fraction = upper / lower;
double resultatan = atan(fraction);
return resultatan;
}
afx_msg void CMyFrameWnd::OnRButtonUp(UINT nFlags, CPoint point)
{
CBitmap m_bmpbuff;
pixel m_pBmp;
m_bmpbuff.CreateBitmapIndirect(&m_bmp);
for (m_nY = 0; m_nY < m_bmp.bmHeight; m_nY++)
{
for (m_nX = 0; m_nX < m_bmp.bmWidth; m_nX++)
{
m_pBmp.red = 123;
m_pBmp.green = 123;
m_pBmp.blue = 123;
m_bmpbuff.SetBitmapBits(sizeof(pixel), &m_pBmp);
}
}
HBITMAP hBmp = (HBITMAP)m_bmpbuff;
WriteDIB(hBmp);
}
BOOL CMyFrameWnd::WriteDIB(HBITMAP hBitmap)
{
BITMAPFILEHEADER bmphdr;
LPBITMAPINFOHEADER bmpInfo;
if (!hBitmap)
return FALSE;
CString szFile;
szFile = "PSD";
CFile file;
if(!file.Open(szFile, CFile::modeWrite|CFile::modeCreate))
AfxMessageBox("Not Done Save");
return FALSE;
bmpInfo = (LPBITMAPINFOHEADER)hBitmap;
int nColors = 1 << bmpInfo->biBitCount;
// Fill in the fields of the file header
bmphdr.bfType = ((WORD) ('M' << 8) | 'B'); // is always "BM"
bmphdr.bfSize = GlobalSize (hBitmap) + sizeof( bmphdr );
bmphdr.bfReserved1 = 0;
bmphdr.bfReserved2 = 0;
bmphdr.bfOffBits = (DWORD) (sizeof( bmphdr ) + bmpInfo->biSize + nColors * sizeof(RGBQUAD));
// Write the file header
file.Write( &bmphdr, sizeof(bmphdr) );
// Write the DIB header and the bits
file.Write(bmpInfo, GlobalSize(hBitmap));
return TRUE;
}
|
|
|
|