【问题标题】:How to resize 8bpp bitmap image in c#?如何在 C# 中调整 8bpp 位图图像的大小?
【发布时间】:2012-07-19 01:04:58
【问题描述】:

这是用于重复识别。

我可以将图像转换为 8bpp 位图,但由于它是索引像素格式,我不知道如何将其缩小。有没有办法在不将其更改为更高像素格式(这会引入更多不需要的颜色)的情况下做到这一点?

谢谢

【问题讨论】:

    标签: c# image bitmap


    【解决方案1】:

    这是 2D 计算机图形学中的常见问题。需要问的总体问题是您想要完成什么。是吗:

    1. 您是否想要一个更小的每像素 8 位图像,以更小的形式最接近地表示原始图像?
    2. 您是否想要一个每像素 8 位的较小图像,该图像具有与原始图像相同的索引颜色图(调色板)?

    例如,当我设计在 8bpp 显示器上运行的 2D 游戏时,我要求美术师以全分辨率的 24 位颜色制作所有原始源图像。然后,我创建了一个工作流程,一次性统一了他们的调色板,所以他们都使用了优化的调色板,并尽可能准确地表示出来。如果是这种情况,我建议您返回原始源图像并将其重新转换为较小的尺寸。

    有时,我正在做一个一次性的实验,或者在飞行中处理艺术,我不在乎确保所有图像都使用相同的调色板。在这种情况下,我会在内存中将图像转换为 24bpp,使用双三次插值(这是一种高质量的调整大小算法)调整它的大小,然后将其重新转换回 8bpp。缺点是这样做会为调整大小的图像生成一个新的、独特的调色板。

    但是,如果您真的想在不更改调色板且内部不上转换为 24bpp 的情况下调整图像大小,则必须使用两个非常糟糕的选择之一:您可以使用抖动来尝试根据大小选择最佳颜色地图 - 一个棘手的过程,涉及仔细跟踪您的颜色错误 - 或者您可以简单地放下扫描线,直到图像与您想要的正确尺寸匹配。

    作为参考,Neo Geo 等传统 2D 游戏机采用了“line drop”方法,这导致它们在今天呈现出古朴且参差不齐的图形外观。现代控制台总是以 16、24 或 32 位颜色重新采样图像,有时甚至使用浮点来表示颜色值。

    【讨论】:

    • 谢谢特德。我正在按照您的建议使用其原始 PixelFormat 调整原始图像的大小,然后使用标准 Web 调色板(0、51、102、153、204、255)将其转换为 8bpp。结果更好,但仍然不够好。处理后的静止图像具有不同的像素颜色,它们看起来与原始图像完全相同。有没有更好的方法来做重复识别?
    • 听起来您确实想保留原始调色板。在这种情况下,你唯一能做的就是删除扫描线。例如,如果您的原始图像是 1000 x 1000,并且您想将其转换为 100 x 100,则必须删除 9 条扫描线,然后保留一条。
    • 我到处搜索,但仍然找不到有关放置扫描线的任何信息。你能给我看一个 C# 代码示例吗?
    • 尝试使用InterpolationMode.NearestNeighbor绘制图像。
    【解决方案2】:

    通常,当您缩小图片时,您会对颜色进行某种插值。想象一下,你有一张 2x2 的图片,顶部的两个像素是黑色的,底部的 2 个像素是白色的。您想将其缩小为 1x2 图片。这两个像素将是黑色和白色的混合,即灰色。

    BB  -->   GG
    WW
    

    其中 G = 灰色(50% 黑色,50% 白色),B = 黑色,W = 白色。
    但是,最终图像中的灰色在原始图像中不存在。对于索引图像,这是一个问题。 您可以选择其中一个像素(随机或使用某种算法):

    BB  -->   BW
    WW
    

    或插值,然后在索引中选择最接近插值结果的颜色。因此,也许您的索引中没有 50% 的灰色,但您确实有 40%。那将非常接近,因此您可以选择它。如果没有足够接近的颜色,您可以退回到第一种方法。

    第三,您可以转换为普通位图,调整大小,然后转换回索引,但根据您对问题的措辞,您似乎想避免这种情况。

    【讨论】:

      猜你喜欢
      • 2017-12-20
      • 2012-06-06
      • 1970-01-01
      • 2013-10-21
      • 2010-12-27
      • 2015-09-22
      • 1970-01-01
      • 2015-06-04
      相关资源
      最近更新 更多