Gtk 实现图片圆角和圆化的方法
Gtk 实现图片圆角和圆化的方法
代码:
#!/usr/bin/env python3
# _*_ coding: utf-8 _*_
#
#
# @File : test_round_image.py
# @Time : 2021-12-10 22:02
# Copyright (C) 2021 WeiKeting<weikting@gmail.com>. All rights reserved.
# @Description :
#
#
import math
import gi
gi.require_version('GdkPixbuf', '2.0')
gi.require_version('Gtk', '3.0')
from gi.repository import GdkPixbuf, Gtk, Gdk
def rounded_image(fn, size=None, corner_radius=0):
import cairo
if size is not None and size[0] > 0 and size[1] > 0:
piu = GdkPixbuf.Pixbuf.new_from_file_at_scale(fn, size[0], size[1], True)
else:
piu = GdkPixbuf.Pixbuf.new_from_file(fn)
w = piu.get_width()
h = piu.get_height()
if corner_radius > 0:
# 圆角
r = min(corner_radius, w / 2., h / 2)
surface = cairo.ImageSurface(cairo.Format.ARGB32, w, h)
ctx = cairo.Context(surface)
Gdk.cairo_set_source_pixbuf(ctx, piu, 0, 0)
# top left 圆角
ctx.arc(r, r, r, -math.pi, -math.pi / 2.)
# top line
ctx.line_to(w - r, 0)
# top right 圆角
ctx.arc(w - r, r, r, -math.pi / 2., 0)
# right line
ctx.line_to(w, -r)
# bottom right 圆角
ctx.arc(w - r, h - r, r, 0, math.pi / 2.)
# bottom line
ctx.line_to(r, h)
# bottom left 圆角
ctx.arc(r, h - r, r, math.pi / 2., math.pi)
# 连接当前path的起点和重点,即left line
ctx.close_path()
# 创建clip(可绘制区域)
ctx.clip()
ctx.paint()
piu = Gdk.pixbuf_get_from_surface(surface, 0, 0, w, h)
else:
# 圆边
sw, sh = (min(w, h),)*2
surface = cairo.ImageSurface(cairo.Format.ARGB32, sw, sh)
ctx = cairo.Context(surface)
# 把原图的pixbuf,居中显示
Gdk.cairo_set_source_pixbuf(ctx, piu, -(w - sh) / 2.0, -(h - sh) / 2.0)
# 圆形path
ctx.arc(sw / 2.0, sh / 2., sh / 2.0, 0, 2 * math.pi)
# 以当前path(圆形),创建clip(可绘制区域)
ctx.clip()
# 把source(pixbuf)画到clip中
ctx.paint()
piu = Gdk.pixbuf_get_from_surface(surface, 0, 0, sw, sh)
return piu
def main():
import sys
f = sys.argv[1]
pb = rounded_image(f, size=None, corner_radius=0)
win = Gtk.Window()
image = Gtk.Image()
image.set_from_pixbuf(pb)
win.add(image)
win.set_default_size(300, 400)
win.show_all()
win.present()
win.connect("delete-event", Gtk.main_quit)
Gtk.main()
if __name__ == '__main__':
main()
代码虽然是python写的,但是看一眼应该就可以写出C语言的版本。
测试环境: Ubuntu 21.10
不过我相信支持python3和Gtk3的环境应该都能跑起来