关于QT图片处理(九宫格图片缩放问题)

加菲猫好胖啊 2013-07-02 05:55:16
用户需求:我要写一个窗口基类,以后公司的同事就使用我这个基类来写程序,提供一种统一的风格.
我的思路:美工画了一个窗口背景图片贴到窗口上,但是如果要适应不同大小的窗口的时候,就必须提供好多背景图片,浪费"硬盘"不说也麻烦.所以我就想在代码里处理一下背景图片以适应不同尺寸的窗口.
后来我听说有一种图片处理方式:"九宫格图片缩放"能满足我的要求. 但是不知道怎么做的.百度也没有这方面的东西.

注:如果是普通的缩放,背景图片里的窗口标题栏和边框会变宽或窄,界面风格就不统一了.
...全文
1027 4 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
oldmtn 2014-08-12
  • 打赏
  • 举报
回复
引用 3 楼 Garfiel_C 的回复:
解决了,下附上代码(用的时候直接把这个函数考到你们工程里就行了)

/*
**  功能                : 9格图处理
**  picName          : 图片名字
**  titleHeight      : 标题栏高度(单位:像素)
**  BorderLineWidth  : 边框宽度(单位:像素)
**  parent           : 带画背景的窗口句柄
**  返回值              :处理完成的图片
*/
QPixmap* NinePatch(QString& picName,int titleHeight,int BorderLineWidth ,QWidget* Wnd)
{
    QPixmap* pix = new QPixmap(picName);
    
    int pixWidth = pix->width();
    int pixHeight = pix->height();
    
    QSize WndSize = Wnd->size();
    int DstWidth = WndSize.width();
    int DstHeight = WndSize.height();
    
    QPixmap pix_1 = pix->copy(0,0,BorderLineWidth,titleHeight);
    QPixmap pix_2 = pix->copy(BorderLineWidth,0,pixWidth-BorderLineWidth*2,titleHeight);
    QPixmap pix_3 = pix->copy(pixWidth-BorderLineWidth,0,BorderLineWidth,titleHeight);
    
    QPixmap pix_4 = pix->copy(0,titleHeight,BorderLineWidth,pixHeight-titleHeight-BorderLineWidth);
    QPixmap pix_5 = pix->copy(BorderLineWidth,titleHeight,pixWidth-BorderLineWidth*2,pixHeight-titleHeight-BorderLineWidth);
    QPixmap pix_6 = pix->copy(pixWidth-BorderLineWidth,titleHeight,BorderLineWidth,pixHeight-titleHeight-BorderLineWidth);
    
    QPixmap pix_7 = pix->copy(0,pixHeight-BorderLineWidth,BorderLineWidth,BorderLineWidth);
    QPixmap pix_8 = pix->copy(BorderLineWidth,pixHeight-BorderLineWidth,pixWidth-BorderLineWidth*2,BorderLineWidth);
    QPixmap pix_9 = pix->copy(pixWidth-BorderLineWidth,pixHeight-BorderLineWidth,BorderLineWidth,BorderLineWidth);
    
    pix_2 = pix_2.scaled(DstWidth-BorderLineWidth*2,titleHeight,Qt::IgnoreAspectRatio);//保持高度拉宽
    pix_4 = pix_4.scaled(BorderLineWidth,DstHeight-titleHeight-BorderLineWidth,Qt::IgnoreAspectRatio);//保持宽度拉高
    pix_5 = pix_5.scaled(DstWidth-3,DstHeight-titleHeight-BorderLineWidth);
    pix_6 = pix_6.scaled(BorderLineWidth,DstHeight-titleHeight-BorderLineWidth,Qt::IgnoreAspectRatio);//保持宽度拉高
    pix_8 = pix_8.scaled(DstWidth-BorderLineWidth*2,BorderLineWidth);//保持高度拉宽
    
    
    QPixmap* resultImg =new QPixmap(WndSize);
    QPainter* painter = new QPainter(resultImg);
    if (!resultImg->isNull())
    {
        painter->drawPixmap(0,0,pix_1);
        painter->drawPixmap(3,0,pix_2);
        painter->drawPixmap(DstWidth-3,0,pix_3);
        painter->drawPixmap(0,titleHeight,pix_4);
        painter->drawPixmap(3,titleHeight,pix_5);
        painter->drawPixmap(DstWidth-3,titleHeight,pix_6);
        painter->drawPixmap(0,DstHeight-3,pix_7);
        painter->drawPixmap(3,DstHeight-3,pix_8);
        painter->drawPixmap(DstWidth-3,DstHeight-3,pix_9);
        painter->end();
    }
    return resultImg;
}


将你的函数稍微修改下,

/*
**  功能                : 9格图处理
**  picName          : 图片名字
**  titleHeight      : 标题栏高度(单位:像素)
**  BorderLineWidth  : 边框宽度(单位:像素)
**  parent           : 带画背景的窗口句柄
**  返回值              :处理完成的图片
*/
QPixmap* NinePatch(QString& picName,int iHorzSplit,int iVertSplit, int DstWidth, int DstHeight)
{
    QPixmap* pix = new QPixmap(picName);

    int pixWidth = pix->width();
    int pixHeight = pix->height();

    QPixmap pix_1 = pix->copy(0, 0, iHorzSplit, iVertSplit);
    QPixmap pix_2 = pix->copy(iHorzSplit, 0, pixWidth-iHorzSplit*2, iVertSplit);
    QPixmap pix_3 = pix->copy(pixWidth-iHorzSplit, 0, iHorzSplit, iVertSplit);

    QPixmap pix_4 = pix->copy(0, iVertSplit, iHorzSplit, pixHeight-iVertSplit*2);
    QPixmap pix_5 = pix->copy(iHorzSplit, iVertSplit, pixWidth-iHorzSplit*2, pixHeight-iVertSplit*2);
    QPixmap pix_6 = pix->copy(pixWidth-iHorzSplit, iVertSplit, iHorzSplit, pixHeight-iVertSplit*2);

    QPixmap pix_7 = pix->copy(0, pixHeight-iVertSplit, iHorzSplit, iVertSplit);
    QPixmap pix_8 = pix->copy(iHorzSplit, pixHeight-iVertSplit, pixWidth-iHorzSplit*2, pixWidth - iHorzSplit*2);
    QPixmap pix_9 = pix->copy(pixWidth-iHorzSplit, pixHeight-iVertSplit, iHorzSplit, iVertSplit);

    pix_2 = pix_2.scaled(DstWidth-iHorzSplit*2,iVertSplit, Qt::IgnoreAspectRatio);//保持高度拉宽
    pix_4 = pix_4.scaled(iHorzSplit, DstHeight-iVertSplit*2, Qt::IgnoreAspectRatio);//保持宽度拉高
    pix_5 = pix_5.scaled(DstWidth-iHorzSplit*2,DstHeight-iVertSplit*2, Qt::IgnoreAspectRatio);
    pix_6 = pix_6.scaled(iHorzSplit, DstHeight-iVertSplit*2, Qt::IgnoreAspectRatio);//保持宽度拉高
    pix_8 = pix_8.scaled(DstWidth-iHorzSplit*2, iVertSplit);//保持高度拉宽


    QPixmap* resultImg =new QPixmap(DstWidth, DstHeight);
    QPainter* painter = new QPainter(resultImg);
    if (!resultImg->isNull()) {
        painter->drawPixmap(0,0,pix_1);
        painter->drawPixmap(iHorzSplit, 0, pix_2);
        painter->drawPixmap(DstWidth-iHorzSplit,0,pix_3);

        painter->drawPixmap(0, iVertSplit, pix_4);
        painter->drawPixmap(iHorzSplit, iVertSplit, pix_5);
        painter->drawPixmap(DstWidth-iHorzSplit, iVertSplit, pix_6);

        painter->drawPixmap(0, DstHeight-iVertSplit, pix_7);
        painter->drawPixmap(iHorzSplit, DstHeight-iVertSplit, pix_8);
        painter->drawPixmap(DstWidth-iHorzSplit, DstHeight-iVertSplit, pix_9);
        painter->end();
    }
    return resultImg;
}
加菲猫好胖啊 2013-07-03
  • 打赏
  • 举报
回复
解决了,下附上代码(用的时候直接把这个函数考到你们工程里就行了)

/*
**  功能                : 9格图处理
**  picName          : 图片名字
**  titleHeight      : 标题栏高度(单位:像素)
**  BorderLineWidth  : 边框宽度(单位:像素)
**  parent           : 带画背景的窗口句柄
**  返回值              :处理完成的图片
*/
QPixmap* NinePatch(QString& picName,int titleHeight,int BorderLineWidth ,QWidget* Wnd)
{
    QPixmap* pix = new QPixmap(picName);
    
    int pixWidth = pix->width();
    int pixHeight = pix->height();
    
    QSize WndSize = Wnd->size();
    int DstWidth = WndSize.width();
    int DstHeight = WndSize.height();
    
    QPixmap pix_1 = pix->copy(0,0,BorderLineWidth,titleHeight);
    QPixmap pix_2 = pix->copy(BorderLineWidth,0,pixWidth-BorderLineWidth*2,titleHeight);
    QPixmap pix_3 = pix->copy(pixWidth-BorderLineWidth,0,BorderLineWidth,titleHeight);
    
    QPixmap pix_4 = pix->copy(0,titleHeight,BorderLineWidth,pixHeight-titleHeight-BorderLineWidth);
    QPixmap pix_5 = pix->copy(BorderLineWidth,titleHeight,pixWidth-BorderLineWidth*2,pixHeight-titleHeight-BorderLineWidth);
    QPixmap pix_6 = pix->copy(pixWidth-BorderLineWidth,titleHeight,BorderLineWidth,pixHeight-titleHeight-BorderLineWidth);
    
    QPixmap pix_7 = pix->copy(0,pixHeight-BorderLineWidth,BorderLineWidth,BorderLineWidth);
    QPixmap pix_8 = pix->copy(BorderLineWidth,pixHeight-BorderLineWidth,pixWidth-BorderLineWidth*2,BorderLineWidth);
    QPixmap pix_9 = pix->copy(pixWidth-BorderLineWidth,pixHeight-BorderLineWidth,BorderLineWidth,BorderLineWidth);
    
    pix_2 = pix_2.scaled(DstWidth-BorderLineWidth*2,titleHeight,Qt::IgnoreAspectRatio);//保持高度拉宽
    pix_4 = pix_4.scaled(BorderLineWidth,DstHeight-titleHeight-BorderLineWidth,Qt::IgnoreAspectRatio);//保持宽度拉高
    pix_5 = pix_5.scaled(DstWidth-3,DstHeight-titleHeight-BorderLineWidth);
    pix_6 = pix_6.scaled(BorderLineWidth,DstHeight-titleHeight-BorderLineWidth,Qt::IgnoreAspectRatio);//保持宽度拉高
    pix_8 = pix_8.scaled(DstWidth-BorderLineWidth*2,BorderLineWidth);//保持高度拉宽
    
    
    QPixmap* resultImg =new QPixmap(WndSize);
    QPainter* painter = new QPainter(resultImg);
    if (!resultImg->isNull())
    {
        painter->drawPixmap(0,0,pix_1);
        painter->drawPixmap(3,0,pix_2);
        painter->drawPixmap(DstWidth-3,0,pix_3);
        painter->drawPixmap(0,titleHeight,pix_4);
        painter->drawPixmap(3,titleHeight,pix_5);
        painter->drawPixmap(DstWidth-3,titleHeight,pix_6);
        painter->drawPixmap(0,DstHeight-3,pix_7);
        painter->drawPixmap(3,DstHeight-3,pix_8);
        painter->drawPixmap(DstWidth-3,DstHeight-3,pix_9);
        painter->end();
    }
    return resultImg;
}


Inhibitory 2013-07-02
  • 打赏
  • 举报
回复
http://www.cppblog.com/biao/archive/2013/06/05/200802.html 本文诣在展示如何在Swing中引入 NinePatch技术(早期有文章里中文译作九格图,暂且这么叫吧^_^,但此术非传统移动手机上的功能布局——九格图哦)。 有Java的源码,抓下来照着在Qt里写一个就可以了,一张图片就可以处理不同大小界面的九宫格。
加菲猫好胖啊 2013-07-02
  • 打赏
  • 举报
回复
我想要的效果就是改变了图片的大小,但是图片里的标题栏和边框的"宽度"或者"高度"都不变

16,816

社区成员

发帖
与我相关
我的任务
社区描述
Qt 是一个跨平台应用程序框架。通过使用 Qt,您可以一次性开发应用程序和用户界面,然后将其部署到多个桌面和嵌入式操作系统,而无需重复编写源代码。
社区管理员
  • Qt
  • 亭台六七座
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧