背景设置 - 裁剪选项

sel*_*ler 4 gnome wallpaper unity 12.04 background

设置墙纸时,您可以从tilezoomcenterscalefillspan选项中进行选择。他们的意思是什么?

如何规模的选择是不同的变焦跨度?我在我的任何壁纸上都看不到差异。

fos*_*dom 6

要了解各种可用选项的复杂性,值得在源代码中稍微挖掘一下,看看每个选项会发生什么。我会尽我最大的努力把这尽可能简单,但有一个警告——你需要享受一点数学!

让我们获取源代码:

 apt-get source gnome-desktop3
 cd gnome-desktop*
 cd libgnome-desktop
Run Code Online (Sandbox Code Playgroud)

现在使用您最喜欢的文本编辑器打开以下源模块:

 gedit gnome-bg.c
Run Code Online (Sandbox Code Playgroud)

有两个关键函数需要检查:

get_scaled_pixbuf

开关(放置){
    案例 G_DESKTOP_BACKGROUND_STYLE_SPANNED:
                new = pixbuf_scale_to_fit (pixbuf, width, height);
        休息;
    案例 G_DESKTOP_BACKGROUND_STYLE_ZOOM:
        new = pixbuf_scale_to_min (pixbuf, width, height);
        休息;

    案例 G_DESKTOP_BACKGROUND_STYLE_STRETCHED:
        new = gdk_pixbuf_scale_simple(pixbuf,宽度,高度,
                           GDK_INTERP_BILINEAR);
        休息;

    案例 G_DESKTOP_BACKGROUND_STYLE_SCALED:
        new = pixbuf_scale_to_fit (pixbuf, width, height);
        休息;

    案例 G_DESKTOP_BACKGROUND_STYLE_CENTERED:
    案例 G_DESKTOP_BACKGROUND_STYLE_WALLPAPER:
    默认:
        new = pixbuf_clip_to_fit (pixbuf, width, height);
        休息;
    }

和功能:

绘制图像区域

开关(背景->位置){
    案例 G_DESKTOP_BACKGROUND_STYLE_WALLPAPER:
        pixbuf_tile(缩放,dest);
        休息;
    案例 G_DESKTOP_BACKGROUND_STYLE_ZOOM:
    案例 G_DESKTOP_BACKGROUND_STYLE_CENTERED:
    案例 G_DESKTOP_BACKGROUND_STYLE_STRETCHED:
    案例 G_DESKTOP_BACKGROUND_STYLE_SCALED:
        pixbuf_blend (scaled, dest, 0, 0, w, h, x + area->x, y + area->y, 1.0);
        休息;
    案例 G_DESKTOP_BACKGROUND_STYLE_SPANNED:
        pixbuf_blend (scaled, dest, 0, 0, w, h, x, y, 1.0);
        休息;
    默认:
        g_assert_not_reached();
        休息;
    }

  • 让我们先看看选项SPAN

这由 case 选项描述 G_DESKTOP_BACKGROUND_STYLE_SPANNED

墙纸(pixbuf)首先缩放到要填充的区域(pixbuf_scale_to_fit),即取原始墙纸并扩展其宽度和高度以匹配该区域。

它使用以下算法进行扩展:

因子 = MIN (max_width / src_width, max_height / src_height);
new_width = floor (src_width * factor + 0.5);
new_height = floor (src_height * factor + 0.5);

src_是壁纸尺寸宽度或高度,而max_是区域尺寸宽度或高度

正如您所看到的,这是一个相当复杂的算法,但基本上它会尝试查看需要扩展的最小维度是多少,然后再通过它计算的相同因子对两个维度进行线性缩放。

此区域是您的显示器或显示器的组合区域。

然后将生成的墙纸 (pixbuf) 与整个区域的桌面背景颜色混合。

  • 让我们看看选项SCALE

这由 case 选项描述 G_DESKTOP_BACKGROUND_STYLE_SCALED

正如您在源代码中看到的,它与SPAN非常相似。它使用与SPAN相同的算法来缩放图片。

然后将生成的墙纸 (pixbuf) 与视口区域的桌面背景颜色混合,即不是所有显示器的组合区域,而是每个显示器单独的区域。

  • 让我们看看选项缩放

这由 case 选项描述 G_DESKTOP_BACKGROUND_ZOOM

墙纸(pixbuf)首先缩放到要填充的区域(pixbuf_scale_to_min),即取原始墙纸并扩展其宽度和高度以匹配该区域。

它使用以下算法进行扩展:

因子 = MAX (min_width / src_width, min_height / src_height);

new_width = floor (src_width * factor + 0.5);
new_height = floor (src_height * factor + 0.5);

src_是壁纸尺寸宽度或高度,而max_是区域尺寸宽度或高度*

请注意与前两个选项的细微差别 - 它计算需要扩展的最大维度,然后再按其计算的相同因子线性缩放两个维度。

然后将生成的墙纸 (pixbuf) 与视口区域的桌面背景颜色混合,即不是所有显示器的组合区域,而是每个显示器单独的区域。

  • 让我们看看选项STRETCH

这由 case 选项描述 G_DESKTOP_BACKGROUND_STRETCHED

墙纸 (pixbuf) 在宽度方向和高度方向都扩展到该区域 - 因此如果您的墙纸不是墙纸的确切尺寸,您可能会失真

然后将生成的墙纸 (pixbuf) 与视口区域的桌面背景颜色混合,即不是所有显示器的组合区域,而是每个显示器单独的区域。

  • 让我们看一下CENTER选项

这由 case 选项描述 G_DESKTOP_BACKGROUND_CENTRED

如果墙纸 (pixbuf) 过大而不适合该区域,即宽度减少到区域宽度,高度减少到区域高度,则实际上将其剪裁到大小。

然后将生成的墙纸 (pixbuf) 与视口区域的桌面背景颜色混合,即不是所有显示器的组合区域,而是每个显示器单独的区域。然后将生成的图像绘制到监视器整个区域的中心。

  • 让我们看看选项TILE

这由 case 选项描述 G_DESKTOP_BACKGROUND_WALLPAPER

墙纸 (pixbuf) 与中心选项类似。

然后将生成的墙纸 (pixbuf) 与视口区域的桌面背景颜色混合,即不是所有显示器的组合区域,而是每个显示器单独的区域。生成的图像从一个角开始重复复制,用每个图像填充整个区域,即在宽度方向和高度方向平铺。


cot*_*eyr 5

这将很难看到,但是......

  • 平铺 - 平铺图像,如地板上的瓷砖,尝试使用非常小的图像,如 100x100。参见示例
  • 缩放 - 放大图像,以便最大尺寸现在是桌面的最大尺寸。例如,800x600 桌面上的 200x100 图像将被缩放到 800x400,留下 200 像素的空白空间。
  • 填充 - 基本上“缩放”到显示器的宽度。无视身高。所以如果你有一个 1000x1000 的分辨率和一个 600x500 的图像,图像将被缩放到 1200x1000 并居中切割顶部和底部。
  • 跨度 - 类似于 Scale,但跨多个显示器。因此,如果您有 2 个 800x600 和一个 1600x600 的图像,您可以在两个显示器上“跨越”它
  • 中心 - 用于将图像放置在单个显示器中央的尺寸过小的图像(尽管较大的图像有效)。
  • 缩放 - “调整”图像的大小。使它的大小与您的桌面完全相同。因此,一个 800x600 的桌面会将 900x200 的图像“缩放”到 800x600,并且失真是该死的。

抱歉,我无法提供瓷砖以外的样品,但图像在很大程度上取决于您的显示器。如果您使用尺寸严重不足且纵横比不佳的图像进行测试,您应该能够轻松地看到有效的选项。