搜索
bottom↓
回复: 78

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

  [复制链接]

出0入0汤圆

发表于 2010-3-8 21:37:52 | 显示全部楼层 |阅读模式
硬件平台:S3C2440(271MHZ)+4.3寸TFT(480*272)

阿莫论坛20周年了!感谢大家的支持与爱护!!

如果想吃一顿饺子,就得从冰箱里取出肉,剁馅儿,倒面粉、揉面、醒面,擀成皮儿,下锅……
一整个繁琐流程,就是为了出锅时那一嘴滚烫流油的热饺子。

如果这个过程,禁不住饿,零食下肚了,饺子出锅时也就不香了……《非诚勿扰3》

出0入0汤圆

 楼主| 发表于 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[40];
        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);
}

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

出0入0汤圆

 楼主| 发表于 2010-3-8 21:41:50 | 显示全部楼层
源程序下载:
点击此处下载 ourdev_537256.rar(文件大小:2K) (原文件名:src.rar)

出0入0汤圆

 楼主| 发表于 2010-3-8 21:42:12 | 显示全部楼层
程序运行效果:


(原文件名:照片 099.jpg)


(原文件名:照片 100.jpg)


(原文件名:照片 101.jpg)


(原文件名:照片 102.jpg)

出0入0汤圆

发表于 2010-3-8 21:45:10 | 显示全部楼层
很厉害,顶一下!

出0入0汤圆

 楼主| 发表于 2010-3-8 21:46:00 | 显示全部楼层
非常酷的视频演示:

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

出0入0汤圆

发表于 2010-3-8 21:50:27 | 显示全部楼层
抢个沙发,楼主用S3C2440玩GUI玩的很爽啊。

出0入0汤圆

 楼主| 发表于 2010-3-8 22:02:42 | 显示全部楼层
回复【6楼】quzegang 璩
抢个沙发,楼主用S3C2440玩GUI玩的很爽啊。
-----------------------------------------------------------------------

GUI还只是其中一小部分.

出10入210汤圆

发表于 2010-3-8 22:47:42 | 显示全部楼层
不错啊.
标记一下.

出0入0汤圆

发表于 2010-3-8 22:51:26 | 显示全部楼层
MARK

出0入0汤圆

 楼主| 发表于 2010-3-9 10:47:24 | 显示全部楼层
即使CPU运行在96MHZ,也非常流畅,无闪烁.

出0入0汤圆

发表于 2010-7-10 22:29:56 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-7-10 22:33:01 | 显示全部楼层
非常不错

出0入0汤圆

发表于 2010-7-10 22:45:32 | 显示全部楼层
整数运算好啊。。。
能查表的不整数运算,能整数运算的不浮点。。。

出0入0汤圆

发表于 2010-7-11 12:33:32 | 显示全部楼层
楼主好强啊,支持!效果不错。
我的bootloader菜单也可以偷师借鉴,呵呵。

出0入0汤圆

发表于 2010-7-11 15:39:08 | 显示全部楼层
这个要M

出0入0汤圆

发表于 2010-7-11 16:39:16 | 显示全部楼层
这个要mark

出0入0汤圆

发表于 2010-7-13 22:57:08 | 显示全部楼层
回复【楼主位】liuweiele Liuwei
-----------------------------------------------------------------------

记号

出0入0汤圆

发表于 2010-7-14 20:35:18 | 显示全部楼层
mark  楼主高人啊。。。

出0入0汤圆

发表于 2010-7-14 23:03:30 | 显示全部楼层
MARK

出0入0汤圆

发表于 2010-8-24 15:03:02 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-8-25 01:12:01 | 显示全部楼层
很好!

出0入0汤圆

发表于 2011-1-27 17:44:21 | 显示全部楼层
这个要M

出0入0汤圆

发表于 2011-1-27 18:45:42 | 显示全部楼层
MARK!

出0入0汤圆

发表于 2011-1-27 20:30:50 | 显示全部楼层
make

出0入0汤圆

发表于 2011-1-27 21:33:10 | 显示全部楼层
make

出0入0汤圆

发表于 2011-1-27 22:23:28 | 显示全部楼层
学习

出0入0汤圆

发表于 2011-1-28 08:33:02 | 显示全部楼层
MARK 以后细看

出50入0汤圆

发表于 2011-1-28 09:36:59 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-1-28 10:29:03 | 显示全部楼层
这个必须要顶!

出0入0汤圆

发表于 2011-1-28 17:15:28 | 显示全部楼层
非常不错,什么时候才能用得上呀

出0入0汤圆

发表于 2011-1-29 02:32:36 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-1-29 07:51:16 | 显示全部楼层
MARK 收藏了

出0入0汤圆

发表于 2011-2-16 14:46:10 | 显示全部楼层
good ,mark

出0入0汤圆

发表于 2011-2-16 14:55:28 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-2-16 15:30:28 | 显示全部楼层
学习一下,mark

出0入0汤圆

发表于 2011-2-16 16:48:48 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-2-16 18:11:36 | 显示全部楼层
MARK!

出0入0汤圆

发表于 2011-2-16 19:53:47 | 显示全部楼层
问一下lz, 用的是什么gui?

出0入0汤圆

发表于 2011-2-16 21:02:06 | 显示全部楼层
很强

出0入0汤圆

发表于 2011-2-16 21:10:59 | 显示全部楼层
MARK!

出0入0汤圆

发表于 2011-2-16 21:28:06 | 显示全部楼层
不错啊.
标记一下.

出0入0汤圆

发表于 2011-2-17 08:49:47 | 显示全部楼层
mark

出0入8汤圆

发表于 2011-2-17 09:37:00 | 显示全部楼层
这个是不错

出0入0汤圆

发表于 2011-2-18 09:23:48 | 显示全部楼层
精品........................................

出0入0汤圆

发表于 2011-2-18 09:52:14 | 显示全部楼层
mark ,学习了

出0入0汤圆

发表于 2011-2-18 12:33:59 | 显示全部楼层
很好啊

出0入0汤圆

发表于 2011-2-18 12:50:40 | 显示全部楼层
mark 图像大小变换

出0入0汤圆

发表于 2011-4-26 09:00:23 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-4-26 09:24:18 | 显示全部楼层
学习

出0入0汤圆

发表于 2012-3-8 08:20:40 | 显示全部楼层
学习了

出0入0汤圆

发表于 2012-3-8 08:37:04 | 显示全部楼层
了解了

出0入0汤圆

发表于 2012-3-8 08:58:37 | 显示全部楼层
学习 图片缩放

出0入0汤圆

发表于 2012-3-8 09:07:17 | 显示全部楼层
mark!

出0入0汤圆

发表于 2012-3-8 09:15:24 | 显示全部楼层

出0入0汤圆

发表于 2012-3-8 09:16:15 | 显示全部楼层
mark

出0入0汤圆

发表于 2012-3-8 09:24:17 | 显示全部楼层
标记一下

出0入0汤圆

发表于 2012-3-25 11:16:45 | 显示全部楼层
先标记一下,以后来学习

出0入0汤圆

发表于 2012-3-25 14:42:09 | 显示全部楼层
不错,以后会用到,标记一下

出0入0汤圆

发表于 2012-3-25 21:12:27 | 显示全部楼层
很厉害,顶一下!

出0入0汤圆

发表于 2012-3-26 22:56:03 | 显示全部楼层
收着以后再看

出0入0汤圆

发表于 2012-3-26 23:02:23 | 显示全部楼层
好贴必须跟进,顶

出0入0汤圆

发表于 2012-3-26 23:53:21 | 显示全部楼层
mark学习

出0入90汤圆

发表于 2012-3-27 00:49:26 | 显示全部楼层
这个不错,到时候可以试试呢!

出0入0汤圆

发表于 2012-11-6 16:34:17 | 显示全部楼层
MARK一下

出0入0汤圆

发表于 2012-11-6 20:52:23 | 显示全部楼层
MARK                    

出0入0汤圆

发表于 2012-11-13 19:46:43 | 显示全部楼层
MARK        

出0入0汤圆

发表于 2012-11-13 20:10:11 | 显示全部楼层
收藏了,~~

出0入0汤圆

发表于 2012-11-13 23:32:54 | 显示全部楼层
MARK           

出0入0汤圆

发表于 2012-11-15 00:35:13 | 显示全部楼层
给力啊 ,学习了

出0入4汤圆

发表于 2012-11-15 07:52:57 | 显示全部楼层
这个必须要顶

出0入0汤圆

发表于 2012-11-15 10:22:36 | 显示全部楼层
收藏了。谢谢。!!

出0入0汤圆

发表于 2012-11-15 11:30:24 | 显示全部楼层
赞lz。。。。。

出0入0汤圆

发表于 2013-5-28 16:00:03 | 显示全部楼层
向高手学习

出0入0汤圆

发表于 2013-8-14 08:21:23 来自手机 | 显示全部楼层
mark……
顶一个…

出0入0汤圆

发表于 2013-9-28 22:31:49 | 显示全部楼层
向楼主学习啊。。

出0入0汤圆

发表于 2013-10-8 17:34:15 | 显示全部楼层
支持一下。

出0入0汤圆

发表于 2013-10-9 15:22:51 | 显示全部楼层
真的很不错

出0入9汤圆

发表于 2013-10-9 15:33:49 | 显示全部楼层
正想试试
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-3-28 19:53

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表