标签:gtk pixbuf rotate arbitrary angle
项目中需要插入图片,并旋转任意角度。我用的GTK版本为windows32bit 2.24,是从官网下的,这版的API中关于rotate pixbuf的api只有一个简单的旋转90°倍数的函数:gdk_pixbuf_rotate_simple (),没有旋转任意角度的函数。google了一天,终于解决了。方式如下:
STEP 1.
搜到了这个bug,他的附件实现了旋转任意角度,但是这个附件文件不全,我添加了一个gdk-pixbuf-private.h文件(从这里找的)。并修改了这几个文件的#include语句,因为他提供的patch原本是编译gtk时使用的,但是我用的gtk是已经编译好了的,无法自己重新编译,因此必须把#include语句改了,这样把这个patch当成我自己项目的代码用就可以了。
STEP 2.
把patch中的那几个.c.h文件放到同一个make目录下,编译运行patch自带的demo,测试效果如下图:
上图是运行demo菜单的image的结果,it works!
patch API说明:
gdk_pixbuf_rotate_matrix_开头的都是一些矩阵工具方法,不重要。
最重要的是这个函数
void gdk_pixbuf_rotate (GdkPixbuf* dst, gdouble dst_x, gdouble dst_y, gdouble* matrix, GdkPixbuf* src, gdouble src_center_x, gdouble src_center_y, gint* result_rect_x, gint* result_rect_y, gint* result_rect_width, gint* result_rect_height, GdkInterpType interp_type);
这个函数把src pixbuf通过rotate matrix转换后写到dst pixbuf中,result_rect_开头的参数应该是函数写出的值,我目前没用到,调用方法可以参考demo,或我的代码片段:
MyPicture *picture = MY_PICTURE(self);
MyPicturePrivate* priv = MY_PICTURE_GET_PRIVATE (picture);
GdkRectangle rect;
if (priv->pixbuf) {
gdouble m[4];
gdouble angle = 45./180*PI;
gdk_pixbuf_rotate_martix_fill_for_rotation(m, angle);
gdk_pixbuf_rotate_matrix_mult_number(m, 1.);
gdk_pixbuf_rotate (priv->pixbuf,
picture->width/2,
picture->height/2,
m,
priv->orignPixbuf,
picture->orignWidth/2,
picture->orignHeight/2,
&rect.x,
&rect.y,
&rect.width,
&rect.height,
GDK_INTERP_NEAREST);
gdk_draw_pixbuf (appState->pixmap,
appState->drawingArea->style->white_gc,
priv->pixbuf,
0,
0,
picture->x + appState->orignX,
picture->y + appState->orignY,
picture->width,
picture->height,
GDK_RGB_DITHER_NORMAL, 0, 0);
}哪位同学发现更好的解决方法,请留言,谢谢~
PS: 没有用cairo处理图片,是因为cairo在处理png时,在我的项目中透明的地方都变成黑色了(原因未知,我是用cairo往pixmap上画的),而且cairo只支持png,不支持jpg等等,于是索性不用cairo画图片了。
本文出自 “一些” 博客,请务必保留此出处http://2924037.blog.51cto.com/2914037/1565768
标签:gtk pixbuf rotate arbitrary angle
原文地址:http://2924037.blog.51cto.com/2914037/1565768