可以将像素划分为较小的像素吗?还是可能有1.54像素而不是1或2像素?

时间:2018-12-27 15:49:19

标签: c floating-point resize pixel bmp

我正在做一个练习,我必须将图像的大小调整为“ f”倍。 “ f”是浮点数,因此我必须考虑1.45、3.54,依此类推。我不想让您解决问题,但对此有一些疑问。

BMP文件中的像素为24位,对吗?因为它是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循环在浮点中将不起作用。

3 个答案:

答案 0 :(得分:2)

我不认为您会被要求拆分单个像素。听起来好像在调整图像大小时要求您添加或删除像素。例如,假设您有一个12 x 12像素的图像,并且放大倍数为1.3。这样您就可以得到15.6 x 15.6的新图像大小,四舍五入为16 x16。

然后,您需要将原始图像中的像素映射到调整大小后的图像中的像素。一种简单的方法是获取较大图像的x和y坐标,然后将它们乘以比例因子(或除以比例因子)以获得较小图像中的相应坐标,然后将整个像素从旧像素复制到新图片。给定上述示例,较大图像中的像素(13,14)对应于x = 13 / 1.3 = 10且y = 14 / 1.3 =〜10.76(四舍五入为11),因此复制旧像素中的像素(10,11)图片移到新图片中的(13,14)。

答案 1 :(得分:1)

@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,11)内的高度为11.54-11 = 0.54单位。因此,新像素的RGB值必须是像素(10、10)和(10、11)的RGB值的加权总和,分别使用0.24和0.54作为权重。这将使您的代码具有按小于1的因子缩放图像的功能。

注释

  • 我使用“矩形”一词是因为我考虑了这样一个事实,即图像的水平比例因子可能不同于垂直比例因子。在这种情况下,水平和垂直比例均为1.3。
  • 加权总和仅使用高度作为权重,因为小矩形仅在垂直轴上相交2个像素。碰巧在水平轴上,小矩形在单个像素内。但是可能存在这样一种情况,即矩形将在水平和垂直方向上相交像素,甚至在同一轴上相交超过2个像素。因此,加权总和应准备好在同一轴上考虑2个以上像素,并且如果两个轴都视为一个矩形,则使用面积而不是宽度或高度。

答案 2 :(得分:0)

像素代表屏幕上的该点,它是原子的。我需要调整屏幕的大小,然后创建算法,该算法将增加或减少行和列的数量,以至于具有像素部分。