liuweiele 发表于 2010-3-8 21:37:52

简洁高效的图像任意尺寸,比例,拉伸,缩放,实现算法(原创)

硬件平台:S3C2440(271MHZ)+4.3寸TFT(480*272)

liuweiele 发表于 2010-3-8 21:40:34

源程序( 由整数运算实现,性能非常高):


#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);
}

/*============================================================================*/

liuweiele 发表于 2010-3-8 21:41:50

源程序下载:
点击此处下载 ourdev_537256.rar(文件大小:2K) (原文件名:src.rar)

liuweiele 发表于 2010-3-8 21:42:12

程序运行效果:

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)

sankesa 发表于 2010-3-8 21:45:10

很厉害,顶一下!

liuweiele 发表于 2010-3-8 21:46:00

非常酷的视频演示:

点击此处下载 ourdev_537264.rar(文件大小:4.05M) (原文件名:P3082117.rar)

quzegang 发表于 2010-3-8 21:50:27

抢个沙发,楼主用S3C2440玩GUI玩的很爽啊。

liuweiele 发表于 2010-3-8 22:02:42

回复【6楼】quzegang 璩
抢个沙发,楼主用S3C2440玩GUI玩的很爽啊。
-----------------------------------------------------------------------

GUI还只是其中一小部分.

rainbow 发表于 2010-3-8 22:47:42

不错啊.
标记一下.

xinyou 发表于 2010-3-8 22:51:26

MARK

liuweiele 发表于 2010-3-9 10:47:24

即使CPU运行在96MHZ,也非常流畅,无闪烁.

kuronca 发表于 2010-7-10 22:29:56

mark

cargle 发表于 2010-7-10 22:33:01

非常不错

ilovezeno 发表于 2010-7-10 22:45:32

整数运算好啊。。。
能查表的不整数运算,能整数运算的不浮点。。。

goooogleman 发表于 2010-7-11 12:33:32

楼主好强啊,支持!效果不错。
我的bootloader菜单也可以偷师借鉴,呵呵。

oldmen 发表于 2010-7-11 15:39:08

这个要M

ammcu 发表于 2010-7-11 16:39:16

这个要mark

heyking 发表于 2010-7-13 22:57:08

回复【楼主位】liuweiele Liuwei
-----------------------------------------------------------------------

记号

binaimei2007 发表于 2010-7-14 20:35:18

mark楼主高人啊。。。

xzhao86 发表于 2010-7-14 23:03:30

MARK

lab1224 发表于 2010-8-24 15:03:02

mark

WOTASOM 发表于 2010-8-25 01:12:01

很好!

steven_sd 发表于 2011-1-27 17:44:21

这个要M

ITOP 发表于 2011-1-27 18:45:42

MARK!

wukong 发表于 2011-1-27 20:30:50

make

rafd 发表于 2011-1-27 21:33:10

make

whyjld 发表于 2011-1-27 22:23:28

学习

sufeila 发表于 2011-1-28 08:33:02

MARK 以后细看

yuzr 发表于 2011-1-28 09:36:59

mark

flyingcys 发表于 2011-1-28 10:29:03

这个必须要顶!

wanglituan 发表于 2011-1-28 17:15:28

非常不错,什么时候才能用得上呀

savagex 发表于 2011-1-29 02:32:36

mark

zhikai_wu 发表于 2011-1-29 07:51:16

MARK 收藏了

guke 发表于 2011-2-16 14:46:10

good ,mark

10000years 发表于 2011-2-16 14:55:28

mark

yeahmen 发表于 2011-2-16 15:30:28

学习一下,mark

Gloriousle 发表于 2011-2-16 16:48:48

mark

gmolzc 发表于 2011-2-16 18:11:36

MARK!

kamingli 发表于 2011-2-16 19:53:47

问一下lz, 用的是什么gui?

jaspertsin 发表于 2011-2-16 21:02:06

很强

Forever 发表于 2011-2-16 21:10:59

MARK!

MCU678 发表于 2011-2-16 21:28:06

不错啊.
标记一下.

davidd 发表于 2011-2-17 08:49:47

mark

kebaojun305 发表于 2011-2-17 09:37:00

这个是不错

Madlax 发表于 2011-2-18 09:23:48

精品........................................

hoocymo 发表于 2011-2-18 09:52:14

mark ,学习了

jiabin1024 发表于 2011-2-18 12:33:59

很好啊

MeSleve 发表于 2011-2-18 12:50:40

mark 图像大小变换

wpnx 发表于 2011-4-26 09:00:23

mark

liitom 发表于 2011-4-26 09:24:18

学习

youxin2004 发表于 2012-3-8 08:20:40

学习了

xjjiang 发表于 2012-3-8 08:37:04

了解了

ngyg12 发表于 2012-3-8 08:58:37

学习 图片缩放

overmountain 发表于 2012-3-8 09:07:17

mark!

zzz1367 发表于 2012-3-8 09:15:24

zjianb 发表于 2012-3-8 09:16:15

mark

mtlsh 发表于 2012-3-8 09:24:17

标记一下

xiaoxiaocomedy 发表于 2012-3-25 11:16:45

先标记一下,以后来学习

luoqindong 发表于 2012-3-25 14:42:09

不错,以后会用到,标记一下

sky5566 发表于 2012-3-25 21:12:27

很厉害,顶一下!{:titter:}{:titter:}

Cotex-Me 发表于 2012-3-26 22:56:03

收着以后再看

kanprin 发表于 2012-3-26 23:02:23

好贴必须跟进,顶

祥子 发表于 2012-3-26 23:53:21

mark学习

honami520 发表于 2012-3-27 00:49:26

这个不错,到时候可以试试呢!

am869943552 发表于 2012-11-6 16:34:17

MARK一下{:lol:}

想不到 发表于 2012-11-6 20:52:23

MARK                  

wutaoforever 发表于 2012-11-13 19:46:43

MARK      

x11223y 发表于 2012-11-13 20:10:11

收藏了,~~

想不到 发表于 2012-11-13 23:32:54

MARK         

337zhang 发表于 2012-11-15 00:35:13

给力啊 ,学习了

jjl3 发表于 2012-11-15 07:52:57

这个必须要顶

oyingzi007 发表于 2012-11-15 10:22:36

收藏了。谢谢。!!

zoto 发表于 2012-11-15 11:30:24

赞lz。。。。。

jsszdfdn 发表于 2013-5-28 16:00:03

向高手学习

xiefy21 发表于 2013-8-14 08:21:23

mark……
顶一个…

sddzycnq 发表于 2013-9-28 22:31:49

向楼主学习啊。。

skyfight 发表于 2013-10-8 17:34:15

支持一下。

JESTER9 发表于 2013-10-9 15:22:51

真的很不错

istars2005 发表于 2013-10-9 15:33:49

正想试试
页: [1]
查看完整版本: 简洁高效的图像任意尺寸,比例,拉伸,缩放,实现算法(原创)