【问题标题】:Can a pixel be divided into smaller pixels? Or is it possible to have 1.54 pixels instead of 1 or 2?一个像素可以分成更小的像素吗?或者是否有可能有 1.54 像素而不是 1 或 2?
【发布时间】:2018-12-27 15:49:19
【问题描述】:

我正在做一个练习,我必须将图像大小调整“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 循环在浮点数中不起作用,因为所有可能性。

【问题讨论】:

  • 图像的重新缩放是通过计算像素的新值来完成的。例如,假设您将一条线(而不是二维图像)缩放 2 倍,并且 4 处的像素为 100% 红色,而 5 处的像素为 100% 绿色。新图像当然会在 8 处有 100% 的红色像素,在 10 处有 100% 的绿色像素,但在 9 处会发生什么?您可以在其中放置一个 50% 红色和 50% 绿色的像素。但随之而来的是并发症。如果按 1.5 缩放,4 处的红色像素变为 6 处的红色像素,但 5 处的绿色像素变为 7.5。所以必须将 7 和 8 处的像素设置为…
  • ... 部分来自这个 100% 的绿色像素。但是,如果您计算附近像素的平均值,则结果像素不会是 100% 的绿色。原始图像的一些亮度会丢失。另一个复杂因素是二维图像导致目标位于由四个像素定义的正方形内,因此必须在二维中进行插值。有多种方法可供选择,没有一个正确的答案。如果您正在做一个练习,应该有更多关于这个练习的预期指导。
  • 理论上一个像素是不能被分解的。但是,有些技术(例如亚像素渲染)利用用户显示布局的低级知识来独立点亮红色/绿色/蓝色元素,以便比理论上更好地控制文本的轮廓。
  • 哦,我们很清楚,我不相信有人会要求您只使用一些 RGB 位并丢弃其他位。我几乎可以肯定这不是正确的答案

标签: c floating-point resize pixel bmp


【解决方案1】:

我不认为您被要求分割单个像素。听起来您在调整图像大小时被要求添加或删除像素。例如,假设您有一个 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)。

【讨论】:

  • 但是如果缩放因子是 0.5 会怎样。如果我将它四舍五入,那么它将是 1。所以没有进行缩放,但用户会要求它是大小的一半。
  • @Max 您没有四舍五入缩放因子。您将乘以或除以缩放因子的结果四舍五入。
【解决方案2】:

@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 个像素,并且如果将两个轴都考虑为单个矩形,则使用面积而不是宽度或高度。

【讨论】:

  • 怎么知道右下角在(10.78, 11.54)?之后我真的不明白你的意思。
  • 好的。我编辑了我的答案。希望这个新的解释会有所帮助。
【解决方案3】:

像素代表屏幕上的点,它是原子的。我需要调整屏幕大小来创建一种算法,该算法将增加或减少具有像素部分的如此热的行数和列数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-21
    相关资源
    最近更新 更多