一个像素是否可以分成更小的像素?或者是否可以使用 1.54 像素而不是 1 或 2?
Can a pixel be divided into smaller pixels? Or is it possible to have 1.54 pixels instead of 1 or 2?
我正在做一个练习,我必须将图像的大小调整 "f" 次。 "f"是一个浮点数,所以我不得不考虑1.45、3.54等等。我不想让你解决问题,但我对此有一些疑问。
BMP文件中一个像素是24bits吧?因为是RGB,所以红色1个字节,绿色1个字节,蓝色1个字节。那么我应该如何划分一个像素呢?例如,如果我有 2.67,那么 0.67 将如何工作?划分一个像素就是划分3个字节,但是划分是有限制的,而且RGB会消失,因为如果我划分一半,那么我只有12位,不足以存储RGB。
另外,当我逐像素复制时,是否可以复制而不是逐像素复制,每次复制0.01像素?这意味着如果我需要 1 个步骤来复制 1 个像素(一次 1 个像素),那么如果我每次复制 0.01 个像素,意味着我将花费我复制整个像素所花费时间的 100 倍。这对我来说听起来很奇怪,因为一次复制 0.01 个像素意味着一次复制 0.01 个字节,如果我正在调整大小(我认为),这可能会搞砸图像。
我试过使用整数,但是例如,for 循环在浮点数中不起作用,因为所有的可能性。
像素表示屏幕上的点,它是原子的。如果您需要调整屏幕大小,您需要创建一个算法来增加或减少具有像素部分的行和列的数量。
我不认为您被要求拆分单个像素。听起来像是在调整图像大小时要求您添加或删除像素。例如,假设您有一张 12 x 12 像素的图像,并且给定了 1.3 的因子来扩展。这将为您提供 15.6 x 15.6 的新图像大小,四舍五入为 16 x 16。
然后您需要将原始图像中的像素映射到调整大小后的图像中的像素。一个简单的方法是获取较大图像的 x 和 y 坐标并将它们乘以(或除以)缩放因子以获得较小图像中的相应坐标,然后将整个像素从旧图像复制到新图片。在上面的示例中,较大图像中的像素 (13,14) 对应于 x = 13/1.3 = 10 和 y = 14 / 1.3 = ~10.76(四舍五入为 11),因此复制旧图像中的像素 (10,11)图像到新图像中的 (13,14)。
@dbush 说的很清楚。但是你也可以用这两个观察来做一个更深层次的算法。
观察 1
在@dbush 示例中,他尝试将 12 x 12 扩展为 16 x 16,因为不可能制作 15.6 x 15.6(因为像素是离散单位)。但是通过这样做,比例因子不再是 1.3,现在是 16/12 = 1.333333333333333。所以你可以用那个数字来做他说的调整。
观察 2
在@dbush 示例中,像素 (13, 14)(我想是从 0 到 15 的像素计数)映射到像素 (10, 10.76)。由于该像素不存在,他四舍五入其坐标以使用 (10, 11) 代替。但是 (10, 10.76) 表示原始图像内部的一个小矩形的左上角的坐标。一个普通像素是一个大小为 1 x 1 的正方形。但是这个小矩形的像素大小是按相同的因子 1.3 缩放的。这个小矩形的大小是 1/1.3 = 0.78(大约)。这意味着这个小矩形的右下角位于 (10.78, 11.54)。
这个必须映射到新图像的小矩形在像素 (10, 10) 内有 11 - 10.76 = 0.24 个高度单位,在像素 (10, 10) 内有 11.54 - 11 = 0.54 个高度单位11).因此,新像素的 RGB 值必须是像素 (10, 10) 和 (10, 11) 的 RGB 值的加权和,分别使用 0.24 和 0.54 作为权重。这将授予您的代码按小于 1 的因数缩放图像的能力。
备注
- 我使用“矩形”这个词是因为我考虑到图像的水平比例因子可能与垂直比例因子不同。在这种特殊情况下,水平和垂直比例均为 1.3。
- 加权和仅使用高度作为权重,因为小矩形仅在垂直轴上与 2 个像素相交。碰巧在水平轴上,小矩形在一个像素内。但是可能会出现矩形在水平和垂直方向上都与像素相交,甚至在同一轴上相交超过 2 个像素的情况。因此,加权和应准备考虑同一轴上超过 2 个像素,如果两个轴都考虑为单个矩形,则使用面积而不是宽度或高度。
我正在做一个练习,我必须将图像的大小调整 "f" 次。 "f"是一个浮点数,所以我不得不考虑1.45、3.54等等。我不想让你解决问题,但我对此有一些疑问。
BMP文件中一个像素是24bits吧?因为是RGB,所以红色1个字节,绿色1个字节,蓝色1个字节。那么我应该如何划分一个像素呢?例如,如果我有 2.67,那么 0.67 将如何工作?划分一个像素就是划分3个字节,但是划分是有限制的,而且RGB会消失,因为如果我划分一半,那么我只有12位,不足以存储RGB。
另外,当我逐像素复制时,是否可以复制而不是逐像素复制,每次复制0.01像素?这意味着如果我需要 1 个步骤来复制 1 个像素(一次 1 个像素),那么如果我每次复制 0.01 个像素,意味着我将花费我复制整个像素所花费时间的 100 倍。这对我来说听起来很奇怪,因为一次复制 0.01 个像素意味着一次复制 0.01 个字节,如果我正在调整大小(我认为),这可能会搞砸图像。
我试过使用整数,但是例如,for 循环在浮点数中不起作用,因为所有的可能性。
像素表示屏幕上的点,它是原子的。如果您需要调整屏幕大小,您需要创建一个算法来增加或减少具有像素部分的行和列的数量。
我不认为您被要求拆分单个像素。听起来像是在调整图像大小时要求您添加或删除像素。例如,假设您有一张 12 x 12 像素的图像,并且给定了 1.3 的因子来扩展。这将为您提供 15.6 x 15.6 的新图像大小,四舍五入为 16 x 16。
然后您需要将原始图像中的像素映射到调整大小后的图像中的像素。一个简单的方法是获取较大图像的 x 和 y 坐标并将它们乘以(或除以)缩放因子以获得较小图像中的相应坐标,然后将整个像素从旧图像复制到新图片。在上面的示例中,较大图像中的像素 (13,14) 对应于 x = 13/1.3 = 10 和 y = 14 / 1.3 = ~10.76(四舍五入为 11),因此复制旧图像中的像素 (10,11)图像到新图像中的 (13,14)。
@dbush 说的很清楚。但是你也可以用这两个观察来做一个更深层次的算法。
观察 1
在@dbush 示例中,他尝试将 12 x 12 扩展为 16 x 16,因为不可能制作 15.6 x 15.6(因为像素是离散单位)。但是通过这样做,比例因子不再是 1.3,现在是 16/12 = 1.333333333333333。所以你可以用那个数字来做他说的调整。
观察 2
在@dbush 示例中,像素 (13, 14)(我想是从 0 到 15 的像素计数)映射到像素 (10, 10.76)。由于该像素不存在,他四舍五入其坐标以使用 (10, 11) 代替。但是 (10, 10.76) 表示原始图像内部的一个小矩形的左上角的坐标。一个普通像素是一个大小为 1 x 1 的正方形。但是这个小矩形的像素大小是按相同的因子 1.3 缩放的。这个小矩形的大小是 1/1.3 = 0.78(大约)。这意味着这个小矩形的右下角位于 (10.78, 11.54)。
这个必须映射到新图像的小矩形在像素 (10, 10) 内有 11 - 10.76 = 0.24 个高度单位,在像素 (10, 10) 内有 11.54 - 11 = 0.54 个高度单位11).因此,新像素的 RGB 值必须是像素 (10, 10) 和 (10, 11) 的 RGB 值的加权和,分别使用 0.24 和 0.54 作为权重。这将授予您的代码按小于 1 的因数缩放图像的能力。
备注
- 我使用“矩形”这个词是因为我考虑到图像的水平比例因子可能与垂直比例因子不同。在这种特殊情况下,水平和垂直比例均为 1.3。
- 加权和仅使用高度作为权重,因为小矩形仅在垂直轴上与 2 个像素相交。碰巧在水平轴上,小矩形在一个像素内。但是可能会出现矩形在水平和垂直方向上都与像素相交,甚至在同一轴上相交超过 2 个像素的情况。因此,加权和应准备考虑同一轴上超过 2 个像素,如果两个轴都考虑为单个矩形,则使用面积而不是宽度或高度。