Рисунок 4.1 – Главное окно программы
Выбрав в меню Файл/Открыть… пльзователь выбирает файл, который следует открыть. Одновременно может быть открыто несколько файлов. С помощью пункта меню Файл/Сохранить сохраняется текущий вид изображения. Пункт меню Файл/Сохранить… позволяет сохранить текущий вид изображения под новым именем.
Пункты меню Вид/Масштаб In, Масштаб Out позволяют увеличивать/уменьшать масштаб изображения (Рисунок 4.2).
Рисунок 4.2 – Масштабирование изображения.
Пункты меню Правка/… позволяют корректировать открытое изображение при помощи фильтров: Яркость/Контраст (Brightness/Contrast), Резкость (Sharp), Размытие (Blur), Инверсия (Inverse) представлены на рис.4.3.
Рисунок 4.3 –Пункты меню Правка
Применение фильтра Размытие оказывает эффект сглаживания деталей изображения. Фильтр целесообразно использовать для повышения качества изображения низкого разрешения. Границы пикселов становятся менее чёткими, сглаживается «шум», что зрительно улучшает качество изображения. Результат применения фильтра представлен на рисунке 4.4.
Фильтр Резкость целесообразно применять при работе с изображением, в котором присутствует большое количество мелких повторяющихся деталей не низкого качества: например, рисунок на ткани или шерсть животных. Применение в этих случаях фильтра Резкость даёт нам в результате изображение, наиболее приближённое к оригиналу. Фильтр Резкость зачастую применяют в рекламной полиграфии для преувеличенного выделения отдельных деталей изображения, на которых следует сделать акцент. Результат применения фильтра представлен на рисунке 4.5.
Фильтр Яркость/Контраст - наиболее часто применяется для цветокоррекции слишком затемнённых изображений. Сначала следует увеличить яркость изображения, затем повысить контрастность. Как правило, контрастность в этом случае следует увеличить немного меньше, чем яркость. Результат применения фильтра представлен на рисунке 4.6.
Фильтр Инверсия инвертирует цвета изображения, что даёт явно заметный, яркий результат. Этот эффект можно использовать для любителей креативного, гипертрофированно яркого дизайна. Применение фильтра представлено на рисунке 4.7.
Рисунок 4.4 – результат применения фильтра Размытие
Рисунок 4.5 – результат применения фильтра Резкость (с масштабом)
Рисунок 4.6 – результат применения фильтра Яркость/Контраст
Рисунок 4.7 – результат применения фильтра Инверсия
ЗАКЛЮЧЕНИЕ
В ходе выполнения данного дипломного проекта было разработано программное обеспечение для открытия и фильтрации растровых изображений при помощи графических фильтров, основанных на пространственных и точечных преобразованиях.
Систематизированы и закреплены практические навыки использования ЭВМ, программного обеспечения, существующих графических редакторов, работающих с растровой графикой, а также теоретические знания по курсу “Технология программирования гибких компьютеризированных систем” .
ПЕРЕЧЕНЬ ССЫЛОК
1. Поляков А.Ю., Брусенцев В.А. Методы и алгоритмы компьютерной графики в примерах на Visual C++, 2-е изд., перераб. и доп. – СПб.: БХВ-Петербург, 2003. – 560 с.
2. Мюррей Д., Райпер У. Ван. Энциклопедия форматов графических файлов/пер. с англ. – К.: BHV, 1997. – 672 с.
3. Холзнер С. Visual C++ 6: учебный курс – СПб: Питер, 2001. – 576 с.
4. Шилдт Г. Справочник программиста по С/С++.: Пер. с англ. – М.: Издательский дом «Вильямс», 2001. – 448 с.
5. Круглински Д., Уингоу С., Шеферд Дж. Программирование на Microsoft Visual C++ 6.0 для профессионалов/Пер. с англ. - СПб: Питер; М.:Издательско-торговый дом "Русская Редакция", 2003. - 864 с.
6. Глушаков С.В., Коваль А.В., Черепнин С.А. Программирование на Visual C++ 6.0. – Харьков: Фолио, 2002.- 726 с.
ПРИЛОЖЕНИЕ
Листсинг программы
// BMDoc.cpp : implementation of the CBMDoc class
//
#include "stdafx.h"
#include "BMViewer.h"
#include "BMDoc.h"
#include "HistDlg.h"
#include "BrightContDlg.h"
#include "DeNoiseDlg.h"
#include "BMView.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CBMDoc
IMPLEMENT_DYNCREATE(CBMDoc, CDocument)
BEGIN_MESSAGE_MAP(CBMDoc, CDocument)
//{{AFX_MSG_MAP(CBMDoc)
ON_COMMAND(ID_EDIT_UNDO, OnEditUndo)
ON_COMMAND(ID_EDIT_BRIGHTNESSANDCONTRAST, OnEditBrightnessandcontrast)
ON_COMMAND(ID_EDIT_INVERTCOLORS, OnEditInvertcolors)
ON_COMMAND(ID_EDIT_BLUR, OnEditBlur)
ON_COMMAND(ID_EDIT_SHARP, OnEditSharp)
ON_UPDATE_COMMAND_UI(ID_EDIT_BLUR, OnUpdateEditBlur)
ON_UPDATE_COMMAND_UI(ID_EDIT_SHARP, OnUpdateEditSharp)
ON_UPDATE_COMMAND_UI(ID_EDIT_UNDO, OnUpdateEditUndo)
ON_UPDATE_COMMAND_UI(ID_EDIT_BRIGHTNESSANDCONTRAST, OnUpdateEditBrightnessandcontrast)
ON_UPDATE_COMMAND_UI(ID_EDIT_INVERTCOLORS, OnUpdateEditInvertcolors)
ON_COMMAND(ID_EDIT_STOP, OnEditStop)
ON_UPDATE_COMMAND_UI(ID_EDIT_STOP, OnUpdateEditStop)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CBMDoc construction/destruction
CBMDoc::CBMDoc():m_EventDoTransform(FALSE, TRUE)
{
// TODO: add one-time construction code here
m_pCurBM=NULL;
m_bEditable=FALSE;
m_pCurFilter=NULL;
}
CBMDoc::~CBMDoc()
{
}
BOOL CBMDoc::OnNewDocument()
{
if (!CDocument::OnNewDocument())
return FALSE;
// TODO: add reinitialization code here
// (SDI documents will reuse this document)
return TRUE;
}
// Адрес пикселя
pCurPix=m_pData+y*DataStrLength+x*3;
// Яркость рассчитывается как 0.3*Red+0.59*Green+0.11*Blue,
// но пиксельные данные хранятся в файле BMP, в порядке BGR
Brightness=(BYTE)((0.11*(*pCurPix) +
0.59*(*(pCurPix+1))+
0.3*(*(pCurPix+2)))*Range/256);
pHist[Brightness]+=1;
}
return TRUE;
};
// stdafx.cpp : source file that includes just the standard includes
//BMViewer.pch will be the pre-compiled header
//stdafx.obj will contain the pre-compiled type information
#include "stdafx.h"
// BMDoc.h : interface of the CBMDoc class
//
/////////////////////////////////////////////////////////////////////////////
#if !defined(AFX_BMDOC_H__0CC04D31_A879_4674_AAD5_292699AE7BA7__INCLUDED_)
#define AFX_BMDOC_H__0CC04D31_A879_4674_AAD5_292699AE7BA7__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
#include <afxmt.h>
#include "Raster.h"
#include "Filter.h"
#define UM_STARTTRANSFORMWM_USER+0x8000
#define UM_ENDOFTRANSFORMUM_STARTTRANSFORM+1
class CBMDoc : public CDocument
{
protected: // create from serialization only
CBMDoc();
DECLARE_DYNCREATE(CBMDoc)
// Attributes
public:
// Флаги
BOOLm_bEditable;// можем ли редактировать данные
CEventm_EventDoTransform; // событие - выполняется преобразование
// Статистика
LONGm_lExecutedPercent;
// Данные
CRaster m_BM[2];// два буфера для изображений
CRaster *m_pCurBM;// указатель на активный буфер
//Фильтры
CFilter*m_pCurFilter;
CBrightCont m_BrightContFilter;
CInvertColors m_InvertColorsFilter;
CBlurm_BlurFilter;
CSharpm_SharpFilter;
// Operations
public:
CSize GetCurrentBMSize();
//Возвращает номер активного буфера
intGetNCurrentBM();
//Возвращает указатель на текущую картинку
CRaster* GetCurrentBMPtr();
//Возвращает указатель на буфер
CRaster* GetBufferBMPtr();
//Поменять текущее изображение и буффер местами
void SwapBM();
//Нарисовать текущее изображение
void DrawCurrent();
// Создает буфер заданного размера
// (при вызове без аргументов размер равен текущей картинке)
// совместимый с текущей картинкой
BOOL CreateCompatibleBuffer(LONG width=0, LONG height=0);
//Запускает поток преобразования
void Transform();
protected:
//Функция потока преобразования
static UINT ThreadProc(LPVOID pv);
//Цикл преобразования с использованием активного фильтра
void TransformLoop();
//Посылает сообщение всем окнам
void InformAllViews(UINT msg, WPARAM wPar=0, LPARAM lPar=0);
public:
// Overrides
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CBMDoc)
public:
virtual BOOL OnNewDocument();
virtual void Serialize(CArchive& ar);
virtual BOOL OnOpenDocument(LPCTSTR lpszPathName);
virtual BOOL OnSaveDocument(LPCTSTR lpszPathName);
//}}AFX_VIRTUAL
// Implementation
public:
void Onio();
virtual ~CBMDoc();
#ifdef _DEBUG
virtual void AssertValid() const;
virtual void Dump(CDumpContext& dc) const;
#endif
protected:
// Generated message map functions
protected:
//{{AFX_MSG(CBMDoc)
afx_msg void OnEditUndo();
afx_msg void OnEditBrightnessandcontrast();
afx_msg void OnEditInvertcolors();
afx_msg void OnEditBlur();
afx_msg void OnEditSharp();
afx_msg void OnUpdateEditBlur(CCmdUI* pCmdUI);
afx_msg void OnUpdateEditSharp(CCmdUI* pCmdUI);
afx_msg void OnUpdateEditUndo(CCmdUI* pCmdUI);
afx_msg void OnUpdateEditBrightnessandcontrast(CCmdUI* pCmdUI);
afx_msg void OnUpdateEditInvertcolors(CCmdUI* pCmdUI);
afx_msg void OnEditStop();
afx_msg void OnUpdateEditStop(CCmdUI* pCmdUI);
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
/////////////////////////////////////////////////////////////////////////////
//{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ will insert additional declarations immediately before the previous line.
#endif // !defined(AFX_BMDOC_H__0CC04D31_A879_4674_AAD5_292699AE7BA7__INCLUDED_)
// BMView.h : interface of the CBMView class
//
/////////////////////////////////////////////////////////////////////////////
#if !defined(AFX_BMVIEW_H__A58B1237_DC72_4389_BA43_93CC54F0F5EA__INCLUDED_)
#define AFX_BMVIEW_H__A58B1237_DC72_4389_BA43_93CC54F0F5EA__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
class CBMView : public CScrollView
{
// Идентификатор таймера
UINT m_nTimer;
// Заголовок окна
CString m_strOrgTitle;
//Виртуальный экран
CBitmap m_VirtScreenBitmap;// растр
CDCm_VirtScreenDC;// контекст
// Масштаб вывода картинки
doublem_dScale;
intm_nStretchMode;
protected: // create from serialization only
CBMView();
DECLARE_DYNCREATE(CBMView)
// Attributes
public:
CBMDoc* GetDocument();
// Operations
public:
BOOL UpdateVirtualScreen();
void OnStartTimer();
void OnStopTimer();
afx_msg LONG OnStartTransform(UINT wParam, LONG lParam);
afx_msg LONG OnEndTransform(UINT wParam, LONG lParam);
// Overrides
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CBMView)
public:
virtual BOOL PreCreateWindow(CREATESTRUCT& cs);
virtual void OnInitialUpdate();
protected:
virtual BOOL OnPreparePrinting(CPrintInfo* pInfo);
virtual void OnBeginPrinting(CDC* pDC, CPrintInfo* pInfo);
virtual void OnEndPrinting(CDC* pDC, CPrintInfo* pInfo);
virtual void OnDraw(CDC* pDC);
virtual void OnUpdate(CView* pSender, LPARAM lHint, CObject* pHint);
virtual void OnPrint(CDC* pDC, CPrintInfo* pInfo);
//}}AFX_VIRTUAL
// Implementation
public:
virtual ~CBMView();
#ifdef _DEBUG
virtual void AssertValid() const;
virtual void Dump(CDumpContext& dc) const;
#endif
protected:
// Generated message map functions
protected:
//{{AFX_MSG(CBMView)
afx_msg BOOL OnEraseBkgnd(CDC* pDC);
afx_msg void OnTimer(UINT nIDEvent);
afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
afx_msg void OnViewZoomin();
afx_msg void OnViewZoomout();
afx_msg void OnViewStretchhalftone();
afx_msg void OnUpdateViewStretchhalftone(CCmdUI* pCmdUI);
afx_msg void OnViewStretchcoloroncolor();
afx_msg void OnUpdateViewStretchcoloroncolor(CCmdUI* pCmdUI);