I've realized about 60% of my project except one thing: When loading some BMP images the app crashes, here is my code source:
ECAEDDoc.h
#if !defined(AFX_ECAEDDOC_H__64E67B6C_E0ED_4F6D_8A70_2387DE188471__INCLUDED_)
#define AFX_ECAEDDOC_H__64E67B6C_E0ED_4F6D_8A70_2387DE188471__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
class CECAEDDoc : public CDocument
{
protected:
CECAEDDoc();
DECLARE_DYNCREATE(CECAEDDoc)
public:
CBitmap m_bmpIn;
CBitmap m_bmpOut;
public:
public:
virtual BOOL OnNewDocument();
virtual void Serialize(CArchive& ar);
virtual BOOL OnOpenDocument(LPCTSTR lpszPathName);
public:
virtual ~CECAEDDoc();
#ifdef _DEBUG
virtual void AssertValid() const;
virtual void Dump(CDumpContext& dc) const;
#endif
protected:
protected:
DECLARE_MESSAGE_MAP()
};
#endif // !defined(AFX_ECAEDDOC_H__64E67B6C_E0ED_4F6D_8A70_2387DE188471__INCLUDED_)
ECAEDDoc.cpp
#include "stdafx.h"
#include "ECAED.h"
#include "ECAEDDoc.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
IMPLEMENT_DYNCREATE(CECAEDDoc, CDocument)
BEGIN_MESSAGE_MAP(CECAEDDoc, CDocument)
END_MESSAGE_MAP()
CECAEDDoc::CECAEDDoc()
{
}
CECAEDDoc::~CECAEDDoc()
{
}
BOOL CECAEDDoc::OnNewDocument()
{
if (!CDocument::OnNewDocument())
return FALSE;
return TRUE;
}
void CECAEDDoc::Serialize(CArchive& ar)
{
if (ar.IsStoring())
{
}
else
{
}
}
#ifdef _DEBUG
void CECAEDDoc::AssertValid() const
{
CDocument::AssertValid();
}
void CECAEDDoc::Dump(CDumpContext& dc) const
{
CDocument::Dump(dc);
}
#endif //_DEBUG
BOOL CECAEDDoc::OnOpenDocument(LPCTSTR lpszPathName)
{
if (!CDocument::OnOpenDocument(lpszPathName))
return FALSE;
HBITMAP hBitmap = (HBITMAP)::LoadImage(NULL, lpszPathName, IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION | LR_LOADFROMFILE);
if (hBitmap)
{
m_bmpIn.DeleteObject();
m_bmpIn.Attach(hBitmap);
}
DIBSECTION ds;
::GetObject(hBitmap, sizeof(DIBSECTION), &ds);
BITMAPINFO bmi;
LPBYTE pBits = (LPBYTE)ds.dsBm.bmBits;
LPBYTE pBitsOut;
HBITMAP hBitmapOut;
ZeroMemory(&bmi, sizeof(bmi));
bmi.bmiHeader = ds.dsBmih;
hBitmapOut = CreateDIBSection(GetDC(NULL), &bmi, DIB_RGB_COLORS, (LPVOID*)&pBitsOut, NULL, 0);
if (!hBitmap || !pBitsOut)
return NULL;
if (hBitmapOut)
{
m_bmpOut.DeleteObject();
m_bmpOut.Attach(hBitmapOut);
}
DIBSECTION dsOut;
::GetObject(hBitmapOut, sizeof(DIBSECTION), &dsOut);
::SetDIBits(GetDC(NULL), hBitmapOut, 0, dsOut.dsBm.bmHeight, pBits, &bmi, DIB_RGB_COLORS);
int Mask[3][3] = {{-2, -1, -2},
{-1, 12, -1},
{-2, -1, -2}};
int sumR;
int sumG;
int sumB;
for (int y = 0; y < dsOut.dsBm.bmHeight; y ++)
for (int x = 0; x < dsOut.dsBm.bmWidth; x ++)
{
sumR = 0;
sumG = 0;
sumB = 0;
for (int i = 0; i < 3; i ++)
{
if ((y + i - 1) < 0 || (y + i - 1) > dsOut.dsBm.bmHeight)
continue;
for (int j = 0; j < 3; j ++)
{
if ((x + j - 1) < 0 || (x + j - 1) > dsOut.dsBm.bmWidth)
continue;
sumB += pBits[(y + i - 1) * ds.dsBm.bmWidthBytes + (x * ds.dsBm.bmBitsPixel / 8) + j - 1] * Mask[i][j] / 2;
sumG += pBits[(y + i - 1) * ds.dsBm.bmWidthBytes + (x * ds.dsBm.bmBitsPixel / 8) + j - 1 + 1] * Mask[i][j] / 2;
sumR += pBits[(y + i - 1) * ds.dsBm.bmWidthBytes + (x * ds.dsBm.bmBitsPixel / 8) + j - 1 + 2] * Mask[i][j] / 2;
}
}
if (sumR < 0)
sumR = 0;
if (sumR > 255)
sumR = 255;
if (sumG < 0)
sumG = 0;
if (sumG > 255)
sumG = 255;
if (sumB < 0)
sumB = 0;
if (sumB > 255)
sumB = 255;
pBitsOut[y * dsOut.dsBm.bmWidthBytes + (x * dsOut.dsBm.bmBitsPixel / 8)] = sumB;
pBitsOut[y * dsOut.dsBm.bmWidthBytes + (x * dsOut.dsBm.bmBitsPixel / 8) + 1] = sumG;
pBitsOut[y * dsOut.dsBm.bmWidthBytes + (x * dsOut.dsBm.bmBitsPixel / 8) + 2] = sumR;
}
return TRUE;
}
and here is a screenshot of the app:
I don't know how to fix it !?