www.pudn.com > isee_code01231.zip > DrawPreView.cpp
#include "StdAfx.h"
#include "DrawPreView.h"
#include "System.h"
#include "draw.h"
#include "Contrast.h"
#include "EdgeEnhance.h"
#include "Filter.h"
#include "Resource.h"
static int prev_width,prev_height,mem_size,Img_size;
static RECT rt;
// 清理内存函数,这里借用了临风的格式
void ClearPreView()
{
EndDraw();
Del(lptemp);
Del(lpPreView);
Del(lpPreBack);
lptemp=NULL;
lpPreView=NULL;
lpPreBack=NULL;
}
// 预览窗口预览绘制函数
void _fnSPE_DrawPreView(LPDRAWITEMSTRUCT lpInfo,int x,int y,int nStype)
{
WORD skip=lpProcInfo->sImageInfo.bitperpix/8;
//求预览图片尺寸
int rcw=lpInfo->rcItem.right-lpInfo->rcItem.left;
int rch=lpInfo->rcItem.bottom-lpInfo->rcItem.top;
if(lpPreView==NULL)
{
lpPreView=(LPBYTE)lpProcInfo->_psbdata;
if(lpPreView==NULL)
{
lpProcInfo->result=PR_MEMORYERR;
return;
}
if(lpProcInfo->sImageInfo.width < rcw || lpProcInfo->sImageInfo.height < rch)
{
if(lpProcInfo->sImageInfo.width >= rcw )
{
prev_width=PREV_WIDTH;
prev_height=lpProcInfo->sImageInfo.height;
rt.left=0;
rt.top=(rch-prev_height)/2;
rt.right=rt.left+prev_width;
rt.bottom=rt.top+prev_height;
}
else if(lpProcInfo->sImageInfo.height >= rch)
{
prev_width=lpProcInfo->sImageInfo.width;
prev_height=PREV_HEIGHT;
rt.left=(rcw-prev_width)/2;
rt.top=0;
rt.right=rt.left+prev_width;
rt.bottom=rt.top+prev_height;
}
else
{
prev_width=lpProcInfo->sImageInfo.width;
prev_height=lpProcInfo->sImageInfo.height;
rt.left=(rcw-prev_width)/2;
rt.top=(rch-prev_height)/2;
rt.right=rt.left+prev_width;
rt.bottom=rt.top+prev_height;
}
//创建预览内存图像
mem_size=prev_height*prev_width*skip;
lptemp=(LPBYTE)New(mem_size);
if(lptemp==NULL)
{
lpProcInfo->result=PR_MEMORYERR;
return;
}
lpPreBack=(LPBYTE)New(mem_size);
if(lpPreBack==NULL)
{
lpProcInfo->result=PR_MEMORYERR;
return;
}
if(lpProcInfo->sImageInfo.width >= rcw )
{
for(int i=0;i_psbdata+i*lpProcInfo->sImageInfo.byteperline+x*skip,PREV_WIDTH*skip);
}
}
else if(lpProcInfo->sImageInfo.height >= rch)
{
for(int j=0,i=y;i_psbdata+i*lpProcInfo->sImageInfo.byteperline,prev_width*skip);
}
}
else
{
//生成预览图像
CopyMemory(lptemp,lpProcInfo->_psbdata ,mem_size);
}
}
else
{
prev_height=PREV_HEIGHT;
prev_width=PREV_WIDTH;
rt.left=0;
rt.top=(prev_width-prev_height)/2;
rt.right=prev_width;
rt.bottom=rt.top+prev_height;
//创建预览内存图像
mem_size=prev_height*prev_width*skip;
lptemp=(LPBYTE)New(mem_size);
if(lptemp==NULL)
{
lpProcInfo->result=PR_MEMORYERR;
return;
}
lpPreBack=(LPBYTE)New(mem_size);
if(lpPreBack==NULL)
{
lpProcInfo->result=PR_MEMORYERR;
return;
}
//生成预览图像
for(int j=0,i=y;i_psbdata+i*lpProcInfo->sImageInfo.byteperline+x*skip ,(PREV_WIDTH)*skip);
}
}
lpPreView=lptemp;
CopyMemory(lpPreBack,lpPreView,mem_size);
}
DoDlgDraw(lpInfo->hDC,&rt,prev_width,prev_height,lpPreView);
}
// 预览窗口(缩比)绘制函数,这里借用了临风的格式
void _fnSPE_DrawResizePreView(LPDRAWITEMSTRUCT lpInfo)
{
float x,y;
if(lpPreView==NULL)
{
lpPreView=(LPBYTE)lpProcInfo->_psbdata;
if(lpPreView==NULL)
return;
//求预览图片尺寸
int rcw=lpInfo->rcItem.right-lpInfo->rcItem.left;
int rch=lpInfo->rcItem.bottom-lpInfo->rcItem.top;
x=(float)lpProcInfo->sImageInfo.width;
y=(float)lpProcInfo->sImageInfo.height;
if(lpProcInfo->sImageInfo.width > rcw || lpProcInfo->sImageInfo.height > rch)
{
if(lpProcInfo->sImageInfo.width >= lpProcInfo->sImageInfo.height)
{
prev_width=rcw;
x=y/x;
x=x*prev_width;
if(x<8)
x=8;
prev_height=(int)x;
rt.left=0;
rt.top=(prev_width-prev_height)/2;
rt.right=prev_width;
rt.bottom=rt.top+prev_height;
}
else
{
prev_height=rch;
x=x/y;
x=x*prev_height;
if(x<8)
x=8;
prev_width=(int)x;
rt.left=(prev_height-prev_width)/2;
rt.top=0;
rt.right=rt.left+prev_width;
rt.bottom=prev_height;
}
}
else
{
prev_width=lpProcInfo->sImageInfo.width;
prev_height=lpProcInfo->sImageInfo.height;
rt.left=(rcw-prev_width)/2;
rt.top=(rch-prev_height)/2;
rt.right=rt.left+prev_width;
rt.bottom=rt.top+prev_height;
}
//创建prev_width*prev_height内存图像
mem_size=prev_width*prev_height*(lpProcInfo->sImageInfo.bitperpix/8);
lpPreBack=(LPBYTE)New(mem_size);
if(lpPreBack==NULL)
{
lpProcInfo->result=PR_MEMORYERR;
// SendMessage(NULL ,WM_CLOSE,0,0);
return;
}
lptemp=(LPBYTE)New(mem_size);
if(lptemp==NULL)
{
lpProcInfo->result=PR_MEMORYERR;
// SendMessage(NULL,WM_CLOSE,0,0);
return;
}
//生成预览图像
_fnSPE_Output_Resize(prev_width,prev_height,(LPBYTE)lptemp);
lpPreView=lptemp;
CopyMemory(lpPreBack,lpPreView,mem_size);
}
DoDlgDraw(lpInfo->hDC,&rt,prev_width,prev_height,lpPreView);
}
// 重定义尺寸,这里借用了临风的格式
int _fnSPE_Output_Resize(int width,int height,LPBYTE lpDestData)
{
LPBYTE lpData=(LPBYTE)lpProcInfo->_psbdata,lpBak,lpBako;
LPBYTE lpdData=lpDestData;
if(lpDestData==NULL )
return PROCERR_FALSE;
int skip = lpProcInfo->sImageInfo.bitperpix/8;
float x=(float)lpProcInfo->sImageInfo.width/(float)width;
float y=(float)lpProcInfo->sImageInfo.height/(float)height;
float x_cnt,y_cnt=0.00;
lpBak=lpBako=lpData;
for(int j=0;jsImageInfo.width*skip*(int)y_cnt;
lpData=lpBak;
}
return TRUE;
}
// 绘制预览图像(缩比),这里借用了临风的格式
void _fnCOM_DrawResizePrView(int nCtlID,LPDRAWITEMSTRUCT lpInfo)
{
switch(nCtlID)
{
case IDC_PRVIEW_CONTRAST:
_fnSPE_DrawResizePreView(lpInfo);
return;
case IDC_PRVIEW_EDGE:
_fnSPE_DrawResizePreView(lpInfo);
return;
case IDC_PRVIEW_FILTER:
_fnSPE_DrawResizePreView(lpInfo);
return;
}
}
void _fnCOM_SetPos_xy(int x,int y)
{
nPos_x=x;
nPos_y=y;
}
int _fnCOM_GetPosx()
{
return nPos_x;
}
int _fnCOM_GetPosy()
{
return nPos_y;
}
// 绘制预览图像,这里借用了临风的格式
void _fnCOM_DrawPrView(int nCtlID,LPDRAWITEMSTRUCT lpInfo)
{
switch(nCtlID)
{
case IDC_PRVIEW_CONTRAST:
_fnSPE_DrawPreView(lpInfo,nPos_x,nPos_y,nStype);
return;
case IDC_PRVIEW_EDGE:
_fnSPE_DrawPreView(lpInfo,nPos_x,nPos_y,nStype);
return;
case IDC_PRVIEW_FILTER:
_fnSPE_DrawPreView(lpInfo,nPos_x,nPos_y,nStype);
return;
}
}
// 预览图像的亮度,对比度调节处理函数
void _fnCOM_AdjustContrastPreView(int Brightness,int Contrast)
{
CopyMemory(lpPreView,lpPreBack,mem_size);
LPBYTE pRed=(LPBYTE)lpPreView;
LPBYTE pGrn=pRed+1, pBlu=pRed+2;
int skip=mem_size/prev_width/prev_height;
for(UINT i=0;i<(UINT)prev_width;i++)
{
for(UINT j=0;j<(UINT)prev_height;j++)
{
_fnSPE_ChangeBrightness(Brightness,pRed,pGrn,pBlu);
_fnSPE_ChangeContrast(Contrast,pRed,pGrn,pBlu);
pRed+=skip;
pGrn+=skip;
pBlu+=skip;
}
}
}
// 预览图像的亮度,对比度调节处理函数
void _fnCOM_AdjustConvolutePreView(int nKernel,int nStrength,KERNEL* kernel)
{
CopyMemory(lpPreView,lpPreBack,mem_size);
WORD skip=mem_size/prev_height;
UINT i,j;
for(i=1;i<(UINT)prev_height-1;i++)
{
for(j=1;j<(UINT)prev_width-1;j++)
{
int red=0,green=0,blue=0;
for(int k=0;kred)
red=r;
if(g>green)
green=g;
if(b>blue)
blue=b;
}
LONG lOffset=(LONG)(i*skip)+(LONG)(j*4);
if(nStrength!=100)
{
BYTE Oldb=*(lpPreBack+lOffset++);
BYTE Oldg=*(lpPreBack+lOffset++);
BYTE Oldr=*(lpPreBack+lOffset);
red=Oldr+(((red-Oldr)*nStrength)/100);
green=Oldg+(((green-Oldg)*nStrength)/100);
blue=Oldb+(((blue-Oldb)*nStrength)/100);
lOffset=(LONG)(i*skip)+(LONG)(j*4);
}
*(lpPreView+lOffset++)=(BYTE)((blue)<(0)?(0):((blue)>(255)?(255):(blue)));
*(lpPreView+lOffset++)=(BYTE)((green)<(0)?(0):((green)>(255)?(255):(green)));
*(lpPreView+lOffset)=(BYTE)((red)<(0)?(0):((red)>(255)?(255):(red)));
}
}
}
// 预览图像的亮度,对比度调节处理函数
void _fnCOM_AdjustEdgePreView(int nStrength,BOOL bAlgorith)
{
CopyMemory(lpPreView,lpPreBack,mem_size);
WORD skip=mem_size/prev_height;
UINT i,j;
for(i=1;i<(UINT)prev_height-1;i++)
{
for(j=1;j<(UINT)prev_width-1;j++)
{
int red=0,green=0,blue=0;
_fnSPE_Edge(&red,&green,&blue,i,j,skip,lpPreBack,nStrength,bAlgorith);
LONG lOffset=(LONG)(i*skip)+(LONG)(j*4);
*(lpPreView+lOffset++)=(BYTE)((blue)<(0)?(0):((blue)>(255)?(255):(blue)));
*(lpPreView+lOffset++)=(BYTE)((green)<(0)?(0):((green)>(255)?(255):(green)));
*(lpPreView+lOffset)=(BYTE)((red)<(0)?(0):((red)>(255)?(255):(red)));
}
}
}
void _fnCOM_MedianFilterPreView(int nPels,int nStype)
{
CopyMemory(lpPreView,lpPreBack,mem_size);
WORD skip=mem_size/prev_height;
UINT i,j;
for(i=1;i<(UINT)prev_height-1-1;i++)
{
for(j=1;j<(UINT)prev_width-1;j++)
{
int red=0,green=0,blue=0;
_fnSPE_MedianFilter(&red,&green,&blue,i,j,1,skip,lpPreBack,nStype);
LONG lOffset=(LONG)(i*skip)+(LONG)(j*4);
*(lpPreView+lOffset++)=(BYTE)((blue)<(0)?(0):((blue)>(255)?(255):(blue)));
*(lpPreView+lOffset++)=(BYTE)((green)<(0)?(0):((green)>(255)?(255):(green)));
*(lpPreView+lOffset)=(BYTE)((red)<(0)?(0):((red)>(255)?(255):(red)));
}
}
}
void _fnCOM_HighFilterPreView(int nStrength,int nStype)
{
CopyMemory(lpPreView,lpPreBack,mem_size);
WORD skip=mem_size/prev_height;
static DWORD dwFact[9];
switch(nStype)
{
case 0:
dwFact[0]=10;
dwFact[1]=10;
dwFact[2]=10;
dwFact[3]=10;
dwFact[4]=160+nStrength;
dwFact[5]=10;
dwFact[6]=10;
dwFact[7]=10;
dwFact[8]=10;
break;
case 1:
dwFact[0]=10;
dwFact[1]=10;
dwFact[2]=10;
dwFact[3]=10;
dwFact[4]=10;
dwFact[5]=10;
dwFact[6]=10;
dwFact[7]=10;
dwFact[8]=10;
break;
}
UINT i,j;
for(i=1;i<(UINT)prev_height-1-1;i++)
{
for(j=1;j<(UINT)prev_width-1;j++)
{
int red=0,green=0,blue=0;
_fnSPE_Filter(&red,&green,&blue,i,j,skip,lpPreBack,dwFact);
LONG lOffset=(LONG)(i*skip)+(LONG)(j*4);
*(lpPreView+lOffset++)=(BYTE)((blue)<(0)?(0):((blue)>(255)?(255):(blue)));
*(lpPreView+lOffset++)=(BYTE)((green)<(0)?(0):((green)>(255)?(255):(green)));
*(lpPreView+lOffset)=(BYTE)((red)<(0)?(0):((red)>(255)?(255):(red)));
}
}
}