我在16位显示器上有一系列原始rgb数据,尺寸为320 * 480.数组大小为320 * 480 * 4 = 6144000。
我想知道如何在不降低图像质量的情况下缩小(80 * 120)?
我发现这个关于在2D数组中缩放图像的链接,但是如何将其应用于我的16位显示数组呢?它不是2D数组(因为它有16位颜色)。
Image scaling and rotating in C/C++
谢谢。
答案 0 :(得分:5)
如果要将较大的图像缩小到较小的图像,则会丢失图像质量。
那么,问题是如何最大限度地减少损失。
有许多算法可以做到这一点,每个算法都有优点和缺点。
通常,您会对图像应用某种滤镜,例如双线性或最近邻。在ImageMagick的上下文中Here is a discussion个此类过滤器。
此外,如果输出将小于每像素16位,则需要执行某种形式的Color Quantization。
答案 1 :(得分:3)
我认为你的意思是16位rgb显示器,而不是每种颜色(红色,绿色和蓝色)为16位的显示器。我还假设你知道你的r,g和b值是如何在16位空间中编码的,因为有two possibilities。
因此,假设您知道如何分割颜色空间,现在可以使用一系列字节数组来表示数据。什么变成一个棘手的决定是,是否使用字节数组,因为你有一组算法已经可以在这些数组上工作,但每个字节会花费你一些额外的比特,你可能无法花费,或者将所有内容都塞进16位格式,然后对每个16位像素的相应位进行处理。只有你能真正回答这个问题;如果你有内存,我会选择字节数组方法,因为它可能更快,你会得到一点额外的精度,使图像最终看起来平滑(呃)。
考虑到这些假设,问题实际上可以归功于您在设备上花了多少时间。如果您的设备速度非常快,则可以实施Lanczos resampling。如果您的设备速度较慢,bicubic interpolation的效果也会非常好。如果您的设备速度更慢,bilinear interpolation就是您的朋友。
如果你真的没有速度,我会在一些外部应用程序(如photoshop)中进行重新缩放,并保存一系列根据需要加载的位图。
答案 2 :(得分:2)
有很多缩小图像的方法,但没有一种方法可以保证不会失去“质量”。最终,在重新缩放过程中信息会丢失。
答案 3 :(得分:0)
你有16位颜色= 2字节,但在你的计算中你使用4乘法器 也许你不需要减小图像尺寸?
通常,在不降低质量的情况下无法缩放光栅图像。一些算法使得缩放几乎没有可见的质量松动。
答案 4 :(得分:0)
由于缩小了4倍,原始图像中的每个4x4像素块将对应输出图像中的单个像素。然后,您可以遍历原始图像中的每个4x4块,然后将其缩小为单个像素。这种减少的一种简单方法(也许不是最好的方法)可以是取RGB组件的平均值或中值。
您应该注意,在不丢失图像质量的情况下无法进行图像缩放,除非原始图像中的所有块都是完全相同的颜色(不太可能)。