Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在c#中调整8bpp位图图像的大小?_C#_Image_Bitmap - Fatal编程技术网

如何在c#中调整8bpp位图图像的大小?

如何在c#中调整8bpp位图图像的大小?,c#,image,bitmap,C#,Image,Bitmap,这是用于重复识别的 我可以将图像转换为8bpp位图,但由于它是一种索引像素格式,我不知道如何将其调整得更小。有没有办法不把它改成更高的像素格式(这会引入更多不需要的颜色) 谢谢通常,缩小图片时,会对颜色进行某种插值。假设你有一张2x2的图片,上面两个像素是黑色的,下面两个是白色的。您想将其缩小为1x2图片。这两个像素将是黑色和白色的混合,即灰色 BB --> GG WW 其中G=灰色(50%黑色,50%白色),B=黑色,W=白色 但是,最终图像中的灰色在原始图像中不存在。对于索引图

这是用于重复识别的

我可以将图像转换为8bpp位图,但由于它是一种索引像素格式,我不知道如何将其调整得更小。有没有办法不把它改成更高的像素格式(这会引入更多不需要的颜色)


谢谢

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

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

或插值,然后在索引中选择最接近插值结果的颜色。所以也许你的指数中没有50%的灰色,但是你有40%的灰色。这很接近,所以你可以选择它。如果没有足够接近的颜色,可以使用第一种方法


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

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

  • 您想要一个更小的每像素8位的图像,它以更小的形式最接近地表示原始图像吗
  • 是否希望每像素8位的图像与原始图像具有相同的索引颜色贴图(调色板)
  • 例如,当我设计在8bpp显示器上运行的2D游戏时,我要求艺术家以全分辨率制作所有24位彩色原始源图像。然后,我创建了一个工作流程,一次统一了他们的调色板,所以他们都使用了优化的调色板,并尽可能精确地表示出来。如果这是您的情况,我建议您返回原始源图像,并将其重新转换为较小的尺寸

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

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


    作为参考,传统的2D控制台,如Neo Geo,采用了“直线下降”的方法,这导致了其古雅和锯齿状的图形外观。现代控制台总是以16、24或32位颜色对图像进行重采样,有时甚至使用浮点表示颜色值。

    谢谢。我正在按照您的建议使用原始像素格式调整原始图像的大小,然后使用标准web调色板(0、51、102、153、204、255)将其转换为8bpp。结果更好,但仍然不够好。处理后仍有不同像素颜色的图像,它们在原始图像中看起来完全相同。有没有更好的方法来进行重复识别?听起来你真的很想保留原来的调色板。在这种情况下,您唯一能做的就是删除扫描线。例如,如果您的原始图像是1000 x 1000,并且您希望将其转换为100 x 100,则必须删除9条扫描线,然后保留一条。我已到处搜索,但仍然找不到有关删除扫描线的任何信息。你能给我看一个C代码示例吗?试着用
    InterpolationMode.NearestNeighbor
    绘制图像。
    BB  -->   BW
    WW