GTK旋转图片(pixbuf)补丁

项目中需要插入图片,并旋转任意角度。我用的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画图片了。

时间: 2024-10-13 17:36:03

GTK旋转图片(pixbuf)补丁的相关文章

Camera图片特效处理综述(Bitmap的Pixels处理、Canvas/paint的drawBitmap处理、旋转图片、裁截图片、播放幻灯片浏览图片<线程固定时间显示一张>)

一种是直接对Bitmap的像素进行操作,如:叠加.边框.怀旧.(高斯)模糊.锐化(拉普拉斯变换). Bitmap.getPixels(srcPixels, 0, width, 0, 0, width, height); newR = (int) (pixR * alpha + layR * (1 - alpha));    newR = Math.min(255, Math.max(0, newR));    ...    srcPixels[pos] = Color.argb(newA, ne

旋转图片

旋转图片 by 伍雪颖 - (void)startAnimation { CABasicAnimation* rotationAnimation; rotationAnimation = [CABasicAnimation animationWithKeyPath:@"transform.rotation.z"]; rotationAnimation.toValue = [NSNumber numberWithFloat: M_PI * 2.0 ]; rotationAnimation

CSS旋转图片

1.实现源码 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="C

js旋转图片的功能

最近突然想研究一下js旋转图片的功能.对于之前的实现方式,就不先说了.现在HTML5很不错,主要了解一下HTML5中的图片旋转吧. 实例演示:  http://www.imqing.com/demo/rotateImg.html 原理:利用canvas对象来旋转. 实现方式:首先创建一个canvas元素,然后把img元素绘入canvas.但是,实际上,这是默认情况,就是图片没旋转时.如果图片要旋转90度的话,就需要先把canvas画布旋转90度后再绘图. 描述如下: (内部旋转原理是这样的,图片

ios新手开发——toast提示和旋转图片加载框

不知不觉自学ios已经四个月了,从OC语法到app开发,过程虽然枯燥无味,但是结果还是挺有成就感的,在此分享我的ios开发之路中的小小心得~废话不多说,先上我们今天要实现的效果图: 有过一点做APP经验的都知道,提示框和等待加载框一直是APP首当其中的效果,ios不像android一样,自带toast和progressbarDialog,所以在做ios开发的时候,我首先想到了先封装这两个基础控件~当然网上的资源数不胜数,但是博主抱着一颗自主研究的精神,做出的效果也不错,也已适配了所有iphone

360度旋转图片小特效

现在,在这个网络发达的时代,一些电子商务公司,需要将自己线上的产品给买家或用户看,为了能让用户了解的更全面,那么把一个物件的产品要展示到方方面面,就要运用到360度旋转图片特效,因为上次有朋友叫我帮她弄这样一个效果,然后结合网上的资源,就小试牛刀了,觉得还挺好玩的,效果还是可以看的吧. 首先呢,需要在HTML文档中引入3deye.min.js文件和jq.js,这些可以在网上下载到免费的,另外,要展示到方方面面的,就要做这件物品的各个角度的图片,我这里是36张图片,每10度一张图片,好了,我就贴出

旋转图片,增加神经网络的准确率

前面我们用全量mnist数据集测试的准确率大概在75%左右,当然是没有经过改进之前的测试. 而我们用少量mnist数据集测试的准确率只有60%左右.两个的区别在于mnist训练数据集的大小,如果我们在全量数据集的基础上在增加新的图片会不会提高准确率呢.下面我们试下通过旋转已知图片的方法看准确率是否有增加. 1.训练 在训练的过程中旋转图片,再训练新的图片. inputs_plusx_img = scipy.ndimage.interpolation.rotate(input_list.resha

css3 3d旋转图片立方体特效代码

一.什么是css3 3d旋转 ? 形成一个3D空间: transform-style:preserve-3d    ( 让父元素形成3D,让其子元素在3D空间进行变化 ). 3d场景,在垂直于屏幕的方法,相对于3d多出个z轴,Z轴:靠近屏幕的方向是正向,远离屏幕的方向是反向,2d场景,在屏幕上水平和垂直的交叉线x轴和y轴. 二.关于css 3d旋转的相关属性及使用方法 变形属性:transform 3D功能函数 ----3D的位移:transform:translate3d(x,y,z);   

[Leetcode] rotate image 旋转图片

You are given an n x n 2D matrix representing an image. Rotate the image by 90 degrees (clockwise). Follow up:Could you do this in-place? 方法一:常规思路: 将图片分为 行数/2 层,然后一层层进行旋转,由外到里.在这个过程中,比较关键的是下标的处理.可从n=3时得出一定的规律.每次旋转时,分析替换的元素对的下标和行.列的关系.如 i=0.j=0时 1:[0]