2009-04-10 34 views
2

我有一个尺寸为320 * 480的16位显示器上的原始rgb数据阵列。该数组的大小为320 * 480 * 4 = 6144000.如何在16位显示器上缩减原始rgb数据的数组

我想知道如何在不损失图像质量的情况下将其缩小(80 * 120)?

我发现这个链接关于缩放二维数组中的图像,但我怎么能将它应用到我的16位显示阵列?它不是二维数组(因为它有16位颜色)。

Image scaling and rotating in C/C++

谢谢。

+0

如果是16位颜色,为什么每个像素都是32位? – 2009-04-10 22:24:37

+0

通常32位像素是24位彩色+8位alpha或24位彩色+8位浪费空间。 – tylerl 2009-04-10 22:43:07

+0

它看起来像显示器是16色不是16位? – 2009-04-11 11:07:30

回答

2

有很多缩小图像的方法,但没有一个可以保证不会失去“质量”。最终,信息在重新缩放过程中丢失。

0

你有16位颜色= 2字节,但在你的计算中使用4乘数。
也许你不需要缩小图像大小?

一般来说,不可能在不失去质量的情况下缩放光栅图像。一些算法使缩放几乎没有可见的质量松动。

5

如果您将较大的图像缩小为较小的图像,将会失去图像质量。

那么问题是如何最大限度地减少损失。

有很多这样做的算法,每个算法都有优缺点。

通常,您将对图像应用某种过滤器,例如双线或最近邻。在ImageMagick的上下文中的这种滤波器的Here is a discussion。另外,如果输出将低于每个像素16位,则需要执行某种形式的Color Quantization

0

由于您缩小了4倍,原始图像中每个4x4像素块将对应于输出图像中的单个像素。然后,您可以循环浏览原始图像中的每个4x4块,然后将其缩小为单个像素。一个简单的方法(可能不是最好的方法)来做这种减少可能是取得RGB分量的平均值或中值。

您应该注意,除非原始图像中的所有块,每个像素都是完全相同的颜色(这是不太可能的),否则不能进行图像缩放而不会丢失图像质量。

3

我假设你的意思是一个16位rgb显示器,而不是每个颜色(红色,绿色和蓝色)为16位的显示器。我还假设你知道你的r,g和b值是如何在16位空间中编码的,因为有two possibilities

因此,假设您知道如何分割色彩空间,现在可以使用一系列字节数组来表示数据。什么变得棘手的决定是是否要使用字节数组,因为你有一个算法体可以完成这些数组的工作,但是会花费你几个额外的比特,你可能无法花费,或者将所有东西都塞进16位格式,然后在每个16位像素的相应位上进行处理。只有你能真正回答这个问题;如果你有内存,我会选择字节数组的方式,因为它可能更快,你会得到一些额外的精度,使图像看起来平滑(呃)。

鉴于这些假设,问题真的可以由您在设备上花费多少时间来回答。如果您的设备速度非常快,则可以实施Lanczos resampling。如果您的设备速度较慢,bicubic interpolation也可以很好地工作。如果你有更慢的设备,bilinear interpolation是你的朋友。

如果你真的没有速度,我会在一些外部应用程序(比如photoshop)中重新缩放,并保存一系列随你需要加载的位图。