是否可以创建圆形(或任何其他非矩形)图像?

时间:2012-07-31 15:37:47

标签: image png image-manipulation

我看到的所有圆盘形图像实际上都在一个矩形框内,并且侧面(下图中的黑色部分)变得透明。

disc-shaped image

是否可以自己制作圆形画布?或者图像总是设计成矩形?

如果是,如何?

5 个答案:

答案 0 :(得分:8)

你是对的,任何非矩形图形确实存在于与轴对齐的边界矩形内。它是这样做的,因为矩形很容易处理。整个显示器本身就是像素的矩形排列。

确定一个点是否在矩形内是非常容易的:如果X坐标位于给定的Xmin和Xmax点之间,并且Y坐标位于Ymin和Ymax之间,则该点位于矩形中。并且这两个测试是独立的 - Xmin和Xmax值不依赖于Y值,反之亦然。这比确定一个点是否位于圆形,三角形或任何其他形状中更容易,您需要乘法或大型查找表等操作。

考虑窗口系统中发生的基本操作。首先,它必须在屏幕上呈现完整的图片。系统内部有一堆重叠的窗口来表示,为了形成图片,它必须决定屏幕上每个像素需要的颜色。这是最简单的矩形。系统扫描每一行和每列,并使用简单边界测试确定包含给定X,Y坐标的最上面的窗口。然后它到那个窗口选择像素的颜色。

相反,当在屏幕上某处单击鼠标时,系统必须确定单击了哪个窗口或对象,然后向其发送单击消息。这是一个非常相同的问题,可以通过沿着重叠对象列表向下走,并根据每个对象的矩形极限测试鼠标指针坐标来轻松处理。

这两项基本操作可以在软件中轻松完成,甚至可以在专用硬件中完成。其他一些不基于矩形的方法会有更多的工作。

答案 1 :(得分:2)

我从未遇到过存储除矩形像素数组以外的任何内容的raster graphics文件格式 - 或其压缩版本。为了存储一些任意形状,文件必须包含某种形式的规范,该形状将填充文件中的像素。我可以看到它是如何完成的,但我从未见过它。

一种方式很简单:

  • 存储一个0和1的矩形数组,其中1s表示文件包含规范的像素;
  • 存储像素本身,在上述阵列中每1个存储一个像素。

另一种方式是存储:

  • 图像矩形边界框的尺寸(以像素为单位);
  • 文件数据部分中每个行中第一个像素与矩形边界框的位置;
  • 像素本身。

很难看到一个令人信服的理由来处理这种方法引发的并发症。

当然,

Vector graphics是一种不同的鱼。

答案 2 :(得分:2)

我知道这不是你的想法,但无限多,无限极薄,完美定位的矩形图像可以组合成任意的非矩形形状。

请参阅http://meyerweb.com/eric/css/edge/raggedfloat/demo.html

当然,在现实世界中,您将被限制在最小1 px高度/宽度。

答案 3 :(得分:0)

计算机编程基于矩阵,它具有90度的确定行和列。因此,设备以运行程序的方式制造,因此屏幕是矩形的。

答案 4 :(得分:0)

问题在于您的像素不一样。 图像的关键特征之一是所有行的大小均相同。这是因为如果行的长度不同,则数组的尺寸将不一致。以这种方式对称地划分一个圆的唯一方法是使用圆内的直径和圆。 因此,圆形图像中的像素如下所示: Not geometrically perfect, homemade

看起来像这样的原因很简单。考虑在矩形上获取坐标的最有效方法。当然,这将是通过(距离x,距离y)的元组,因为对于最大x的一些任意限制以及对y的单独限制,这些坐标的范围是一个矩形。但是,将填充一个圆的一系列坐标将由成对的(距离x,度y)组成。可以使用(x,y)坐标,但实际上是在圆周围形成一个正方形,并在该正方形上找到不允许某些的点。 当我们将圆坐标划分为像素时,它们看起来像上面的那样。 这里的每个部分都是一个像素。但是,存在一个很大的问题:最靠近边缘的像素要比靠近中心的像素大。为了获得高清晰度的外部像素,您需要内部像素的图像质量不合理。那将是巨大的空间浪费。圆形图像看起来像您发布的图像的原因是因为矩形均匀分布,因此没有此问题。因此,人们通常更喜欢只画圆周围的正方形。制作一种新的图像格式只是为了排除角落中相当少的像素,这是荒谬的,因此它们只使用现有的像素。 希望这是您想要的答案。