简洁高效的图像任意尺寸,比例,拉伸,缩放,实现算法(原创)
硬件平台:S3C2440(271MHZ)+4.3寸TFT(480*272) 源程序( 由整数运算实现,性能非常高):#include "Include.h"
/*============================================================================*/
/*============================================================================*/
int gdev_stretch_blt( struct DC *dst_pdc,int dst_x,int dst_y,int dst_dx,int dst_dy,
struct DC *src_pdc,int src_x,int src_y,int src_dx,int src_dy,
GUI_ROP rop)
{
COORD xx,yy,xx0,yy0;
int x_scal,y_scal;
GUI_COLOR color;
////
//调整x,y缩放系数(算法优化:除法->乘法->加法)
x_scal =(1.0/((float)dst_dx/(float)src_dx))*65536.0;
y_scal =(1.0/((float)dst_dy/(float)src_dy))*65536.0;
xx =src_x;
yy =src_y;
dst_dx +=dst_x; //计算dst_x的结束坐标
dst_dy +=dst_y; //计算dst_y的结束坐标
for(yy0=dst_y;yy0<dst_dy;yy0++)
{
for(xx0=dst_x;xx0<dst_dx;xx0++)
{
color=src_pdc->GetPixel(src_pdc,HIWORD(xx),HIWORD(yy));
dst_pdc->PutPixel(dst_pdc,LOWORD(xx0),LOWORD(yy0),color);
xx+=x_scal;
}
xx =src_x;
yy +=y_scal;
}
return 1;
}
/*============================================================================*/
static U32 StretchBltTestProc(HWND hwnd,U32 msg,WPARAM wParam,LPARAM lParam)
{
HDC hdc0,hdc1,hdc;
RTC_TIME time;
char buf;
static int dx,dy,x_inc,y_inc;
COORD x,y;
RECT rc;
////
switch(msg)
{
case MSG_CREATE:
TimerCreate(hwnd,0x3000,100);
dx=0;
dy=0;
x_inc=4;
y_inc=8;
break;
////
case MSG_CHAR:
switch(wParam)
{
case VK_LEFT:
GetWindowRect(hwnd,&rc);
MoveWindow(hwnd,rc.x-8,rc.y);
break;
////
case VK_RIGHT:
GetWindowRect(hwnd,&rc);
MoveWindow(hwnd,rc.x+8,rc.y);
break;
////
case VK_UP:
GetWindowRect(hwnd,&rc);
MoveWindow(hwnd,rc.x,rc.y-8);
break;
////
case VK_DOWN:
GetWindowRect(hwnd,&rc);
MoveWindow(hwnd,rc.x,rc.y+8);
break;
////
}
break;
////
case MSG_COMMAND:
{
U16 code,id;
////
code =HIWORD(wParam);
id =LOWORD(wParam);
////
}
break;
///////
case MSG_ERASEBKGND:
if(1)
{
RECT rc;
/////
hdc =GetClientDC(hwnd);
GetWindowClientRect(hwnd,&rc);
FillRectangle(hdc,0,0,rc.dx,rc.dy,GetWindowBkColor(hwnd));
ReleaseDC(hdc);
}
break;
////
case MSG_TIMER:
GetWindowClientRect(hwnd,&rc);
if(dx<=0) x_inc =4;
if(dy<=0) y_inc =8;
if(dx>=rc.dx) x_inc =-4;
if(dy>=rc.dy) y_inc =-8;
dx+=x_inc;
dy+=y_inc;
InvalidateRect(hwnd,0,1);
break;
////////////
case MSG_PAINT:
hdc=BeginPaint(hwnd);
hdc0 =CreateMemDC(64,16);
FontSetSize(hdc0,12);
GetWindowClientRect(hwnd,&rc);
RTC_GetTime(&time);
StrPrintf(buf,"%02d:%02d:%02d",time.Hour,time.Min,time.Sec);
Label(hdc0,0,0,64,16,RGB(00,24,00),RGB(60,160,00),RGB(0,0,0),CENTER,buf);
//FillRectangle(hdc,0,0,rc.dx,rc.dy,RGB(80,80,120));
x =(rc.dx-dx)>>1;
y =(rc.dy-dy)>>1;
x =MAX(0,x);
y =MAX(0,y);
dx =MIN(rc.dx,dx);
dy =MIN(rc.dy,dy);
StretchBlt(hdc,x,y,dx,dy,hdc0,0,0,64,16,0);
StrPrintf(buf,"宽度:%d,高度:%d ",dx,dy);
TextOut(hdc,4,4,RGB(255,0,0),RGB_TRANS,buf);
ReleaseDC(hdc0);
EndPaint(hwnd,hdc);
break;
////
default: DefaultWindowProc(hwnd,msg,wParam,lParam);
}
return MSG_NULL;
}
/*============================================================================*/
void StretchBltTest(void)
{
HWND hwnd;
MSG msg;
////
hwnd =CreateMainWindow( 80,80,240,180,
RGB(80,80,120),
WS_CAPTION|WS_BORDER,
0,
StretchBltTestProc,
"StretchBlt 函数演示");
ShowWindow(hwnd,0);
while(GetMessage(&msg,hwnd))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
DestroyMainWindow(hwnd);
}
/*============================================================================*/ 源程序下载:
点击此处下载 ourdev_537256.rar(文件大小:2K) (原文件名:src.rar) 程序运行效果:
http://cache.amobbs.com/bbs_upload782111/files_27/ourdev_537257.jpg
(原文件名:照片 099.jpg)
http://cache.amobbs.com/bbs_upload782111/files_27/ourdev_537258.jpg
(原文件名:照片 100.jpg)
http://cache.amobbs.com/bbs_upload782111/files_27/ourdev_537259.jpg
(原文件名:照片 101.jpg)
http://cache.amobbs.com/bbs_upload782111/files_27/ourdev_537260.jpg
(原文件名:照片 102.jpg) 很厉害,顶一下! 非常酷的视频演示:
点击此处下载 ourdev_537264.rar(文件大小:4.05M) (原文件名:P3082117.rar) 抢个沙发,楼主用S3C2440玩GUI玩的很爽啊。 回复【6楼】quzegang 璩
抢个沙发,楼主用S3C2440玩GUI玩的很爽啊。
-----------------------------------------------------------------------
GUI还只是其中一小部分. 不错啊.
标记一下. MARK 即使CPU运行在96MHZ,也非常流畅,无闪烁. mark 非常不错 整数运算好啊。。。
能查表的不整数运算,能整数运算的不浮点。。。 楼主好强啊,支持!效果不错。
我的bootloader菜单也可以偷师借鉴,呵呵。 这个要M 这个要mark 回复【楼主位】liuweiele Liuwei
-----------------------------------------------------------------------
记号 mark楼主高人啊。。。 MARK mark 很好! 这个要M MARK! make make 学习 MARK 以后细看 mark 这个必须要顶! 非常不错,什么时候才能用得上呀 mark MARK 收藏了 good ,mark mark 学习一下,mark mark MARK! 问一下lz, 用的是什么gui? 很强 MARK! 不错啊.
标记一下. mark 这个是不错 精品........................................ mark ,学习了 很好啊 mark 图像大小变换 mark 学习 学习了 了解了 学习 图片缩放 mark! 顶 mark 标记一下 先标记一下,以后来学习 不错,以后会用到,标记一下 很厉害,顶一下!{:titter:}{:titter:} 收着以后再看 好贴必须跟进,顶 mark学习 这个不错,到时候可以试试呢! MARK一下{:lol:} MARK MARK 收藏了,~~ MARK 给力啊 ,学习了 这个必须要顶 收藏了。谢谢。!! 赞lz。。。。。 向高手学习 mark……
顶一个… 向楼主学习啊。。 支持一下。 真的很不错 正想试试
页:
[1]