将图像的一部分绘制到开罗表面

发布于 2024-10-12 01:32:47 字数 246 浏览 5 评论 0原文

我正在使用 pygtk 和 cairo (...我必须说很棒的东西。感谢所有人)

我想知道如何在我的 cairo 表面上的大绘图区域上呈现部分图像。

我希望显示表面内的区域看起来被剪切,这样我就可以在这些区域中滚动图像,而不会干扰周围的绘制项目。

我可以将用于零件绘制的图像剪切到表面上,还是必须以正确的顺序获取绘图顺序,以便需要剪辑的图像重叠,从而根据需要隐藏部分并显示剪辑?

感谢您的指点

尼克

I am using pygtk and cairo (...wonderful stuff I must say. Thanks to all)

I am wondering how to present parts of images on my my cairo surface on a large drawingarea.

I would like to have areas within the displayed surface that appear to act clipped so I can scroll images through these areas without disturbing the surrounding drawn items.

Can I cut images for part drawing onto a surface or must I just get the drawing sequence in the proper order so that the images needing to be clipped are overlain and so part hidden as required and appear clipped?

thanks for any pointers

nick

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

悲歌长辞 2024-10-19 01:32:47

开罗确实很棒! ctx.clip() 是一种方法,使用剪切路径(如下所示,仅在 pycairo 中,其中最终绘制的矩形仅命中三角形剪切区域)。

您还可以使用 CAIRO_OPERATOR_OUT 传输模式(我认为),但我对传输模式不太熟悉。这仅适用于第一次绘制,因为您的内容会填充一点 Alpha。

(当然,您建议的“绘画顺序”也很好用!)

import cairo

WIDTH, HEIGHT = 256, 256

surface = cairo.ImageSurface (cairo.FORMAT_ARGB32, WIDTH, HEIGHT)
ctx = cairo.Context (surface)

ctx.rectangle(0,0,300,300)
ctx.set_source_rgb(0,0,0)
ctx.fill()

ctx.move_to(0,0)
ctx.line_to(200,90)
ctx.line_to(90,200)
ctx.line_to(0,0)
ctx.close_path()
ctx.clip()

ctx.rectangle(0,0,300,300)
ctx.set_source_rgb(1,1,0)
ctx.fill()

surface.write_to_png("clipped.png")

Cairo is indeed wonderful! ctx.clip() is one way to do it, using a clipping path (shown below in just pycairo, where the final draw rectangle only hits the triangular clipped area).

You could also use a transfer mode of CAIRO_OPERATOR_OUT (I think), but I'm less familiar with the transfer modes. And that would only work on the first draw, since your content would fill the alpha a bit.

(Your suggestion of "Painting Order" will work fine, too, of course!)

import cairo

WIDTH, HEIGHT = 256, 256

surface = cairo.ImageSurface (cairo.FORMAT_ARGB32, WIDTH, HEIGHT)
ctx = cairo.Context (surface)

ctx.rectangle(0,0,300,300)
ctx.set_source_rgb(0,0,0)
ctx.fill()

ctx.move_to(0,0)
ctx.line_to(200,90)
ctx.line_to(90,200)
ctx.line_to(0,0)
ctx.close_path()
ctx.clip()

ctx.rectangle(0,0,300,300)
ctx.set_source_rgb(1,1,0)
ctx.fill()

surface.write_to_png("clipped.png")
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文