• 17781阅读
  • 29回复

图片放大后 失真?! [复制链接]

上一主题 下一主题
离线iroot
 
只看楼主 倒序阅读 楼主  发表于: 2010-07-27
  最近 在编写 类似于 千千静听的播放器,遇到了一个问题啊。

  使用 QImage的 scale函数 或是 QPixmap的 scale函数 放大 图片后会失真

  到底 要怎么做,才能让 图片放大后不失真呢?

   各位大侠,快前来帮忙吧。。。
  
   附图:

    1.  千千静听 皮肤文件提取出来的播放列表图片

        

    2.  运行千千静听后, 默认的播放列表 界面

          

    3.  对 千千静听的默认播放列表界面 进行 拉伸 的 截图

          
[ 此帖被iroot在2010-07-28 17:39重新编辑 ]
离线dbzhang800

只看该作者 1楼 发表于: 2010-07-27
图片放大必然效果不好,除非是矢量图
离线water_wf

只看该作者 2楼 发表于: 2010-07-27
肯定的,拉伸必然失真
离线sbtree
只看该作者 3楼 发表于: 2010-07-27
给你一个我的做法,保存原始图片的文件名称,在拉伸之前重新载入, 当然这样做只能解决被缩小的Image重新复原的问题,不过可以部分解决标量图的缩放失真问题
windows 7 + VC++2008 + Qt4.5.2
离线孤云白鹤
只看该作者 4楼 发表于: 2010-07-27
创建一个临时画布,大小变化了scale倍,再将以前画布上的内容复制到现在的画布上,将放大后的内容再复制回原来的画布上,这样只传递内容,不传递坐标系,让scale重置为1就可以了..........
谁若游戏人生,他便一事无成;谁不能主宰自己,便永远是一个奴隶............
离线iroot
只看该作者 5楼 发表于: 2010-07-27
引用第4楼孤云白鹤于2010-07-27 17:09发表的  :
创建一个临时画布,大小变化了scale倍,再将以前画布上的内容复制到现在的画布上,将放大后的内容再复制回原来的画布上,这样只传递内容,不传递坐标系,让scale重置为1就可以了..........


是用QPixmap 嘛?

千千静听中 的 播放列表 可以任意缩放而不会变形,因为从 它的皮肤文件里可以看出 是 一张 图片。我想实现这个功能。附图:




离线jonike

只看该作者 6楼 发表于: 2010-07-27
哈,真漂亮。想问下这个外框窗口怎么制作。内部可以用css来定义。但这个窗口外框和标题栏怎么办。。
离线iroot
只看该作者 7楼 发表于: 2010-07-27
回 6楼(jonike) 的帖子
别误会了。。。

这个是 千千静听的 播放列表, 不是我做的。。。

我想问的也是 怎么做出 这样的效果。。。

我自己编程后,图片一随着窗口的放大,图片也跟着模糊起来。。。

郁闷啊。。。。
离线dbzhang800

只看该作者 8楼 发表于: 2010-07-27
Re:回 6楼(jonike) 的帖子
引用第7楼iroot于2010-07-27 19:37发表的 回 6楼(jonike) 的帖子 :
别误会了。。。
这个是 千千静听的 播放列表, 不是我做的。。。
我想问的也是 怎么做出 这样的效果。。。
.......

你应该考虑stylesheet,即使自己画,也不能图片整体拉伸嘛。
找到图片,横切两刀,竖切两刀分成9块(可以程序内生成,也可以直接是9个图片)。各部分的变化情况不同
离线iroot
只看该作者 9楼 发表于: 2010-07-27
回 8楼(dbzhang800) 的帖子
整张图片被切割成9块, 如果某块 进行拉伸,难道不会失真?!

千千静听 播放列表 就是 一张图片, 不管怎么拉伸,都不会模糊, 到底 是怎么做到的?
离线dbzhang800

只看该作者 10楼 发表于: 2010-07-27
Re:回 8楼(dbzhang800) 的帖子
引用第9楼iroot于2010-07-27 20:49发表的 回 8楼(dbzhang800) 的帖子 :
整张图片被切割成9块, 如果某块 进行拉伸,难道不会失真?!
千千静听 播放列表 就是 一张图片, 不管怎么拉伸,都不会模糊, 到底 是怎么做到的?

你把千千静听 的那个图片贴出来让大家看看。同时你也可以贴它的界面在两种不同拉伸下的截图。

个人不相信是你说的这个情况
离线water_wf

只看该作者 11楼 发表于: 2010-07-28
能不能把图片贴一下,看看效果
离线iroot
只看该作者 12楼 发表于: 2010-07-28
回 10楼(dbzhang800) 的帖子
已贴出图片了。。。
离线iroot
只看该作者 13楼 发表于: 2010-07-28
回 11楼(water_wf) 的帖子
贴出来了。。。
离线dbzhang800

只看该作者 14楼 发表于: 2010-07-28
Re:回 10楼(dbzhang800) 的帖子
引用第12楼iroot于2010-07-28 17:43发表的 回 10楼(dbzhang800) 的帖子 :
已贴出图片了。。。


恩,我现在放心了,你可以重新考虑我前面提到的图片切9块的问题了。
离线iroot
只看该作者 15楼 发表于: 2010-07-28
是 什么原理呢?
离线dbzhang800

只看该作者 16楼 发表于: 2010-07-28
引用第15楼iroot于2010-07-28 19:34发表的  :
是 什么原理呢?  

Qt 中至少有两处用到了这个东东

http://doc.qt.nokia.com/4.7-snapshot/qml-borderimage.html
http://doc.qt.nokia.com/4.7-snapshot/stylesheet-reference.html#border-image

当然,更详细的东西,估计还是应该去搜索 css  border image
离线iroot
只看该作者 17楼 发表于: 2010-07-28
回 16楼(dbzhang800) 的帖子
谢谢,马上去看。。。

除了 样式表 这种方法,不知道是否 可有 其他方法呢?
离线water_wf

只看该作者 18楼 发表于: 2010-07-28
看不出来那是张图片,特意看了下,怎么确定是图片呢?
离线iroot
只看该作者 19楼 发表于: 2010-07-28
回 18楼(water_wf) 的帖子
看不出来?

播放列表界面 明明就是用到了 皮肤文件里那张 图片啊。 只是 播放列表界面还使用另外的图片,比如那个 代表关闭的 “X”  图片。。。
离线water_wf

只看该作者 20楼 发表于: 2010-07-29
上面的按钮是图片,我也认为,背景也是图片吗?你能单独贴下皮肤文件中的那张图片吗?
离线iroot
只看该作者 21楼 发表于: 2010-07-29
回 20楼(water_wf) 的帖子
已经贴过了,  注意看 第一张图片啊。。。。
离线water_wf

只看该作者 22楼 发表于: 2010-07-29
哦,看到了,这个图像中间部分是单一颜色的,大都scale应该没问题,四周裁剪就可以了
离线robertkun

只看该作者 23楼 发表于: 2010-07-29
路过,和芊芊有啥区别呀
                                              简单的生活使人快乐!
离线XChinux

只看该作者 24楼 发表于: 2010-07-29
对于渐进色背景,圆角,都是可以用qt stylesheet搞定的。
二笔 openSUSE Vim N9 BB10 XChinux@163.com 网易博客 腾讯微博
承接C++/Qt、Qt UI界面、PHP及预算报销系统开发业务
离线iroot
只看该作者 25楼 发表于: 2010-07-29
回 22楼(water_wf) 的帖子
正有此意啊。。。
离线iroot
只看该作者 26楼 发表于: 2010-07-29
回 24楼(XChinux) 的帖子
使用 qt stylesheet,我考虑过,但是有一点不足,就是 要直接写出  图片的具体路径,而不能 以 QString 变量 来指定。。 这很不灵活。
离线unitcode

只看该作者 27楼 发表于: 2010-07-31
为什么不用SVG呢?

SVG放大了也不会失真的。
[ 此帖被unitcode在2010-07-31 00:36重新编辑 ]
离线jdwx

只看该作者 28楼 发表于: 2011-08-24
回 27楼(unitcode) 的帖子
用就要用SVG!
发帖时要说明:操作系统、Qt版本、编译器,这样能更快的得到回复。
离线cutemmll
只看该作者 29楼 发表于: 2011-08-24
Re:回 24楼(XChinux) 的帖子
引用第26楼iroot于2010-07-29 18:50发表的 回 24楼(XChinux) 的帖子 :
使用 qt stylesheet,我考虑过,但是有一点不足,就是 要直接写出  图片的具体路径,而不能 以 QString 变量 来指定。。 这很不灵活。

其实不然,你想用多少变量就可以用多少变量
比如:
  1. QString fpath; //保存图片的路径
  2. QString sheet; //保存qss
  3. sheet = QString("QLabel{background-image: url(%1);}").arg(fpath);
  4. this->setStyleSheet(sheet);
这样就是变量指定了。

c------------enjoy qt & enjoy life-----------++
快速回复
限100 字节
 
上一个 下一个