数组,复制像素以纠正索引,算法

时间:2012-11-09 20:33:24

标签: c++ objective-c ios c

我的图像尺寸是2x2,所以计数像素= 4

一个像素--4个字节

所以我有一个16字节的数组 - mas [16] - width * height * 4 = 16

我想制作相同的图像,但尺寸更重要的是2,这意味着代替一个将是四个像素

新数组的大小为64字节 - newMas [16] - width * 2 * height * 2 * 4

问题,我无法将像素复制到newMas,用不同大小的图像正确复制像素 enter image description here

此代码将像素复制到mas [16]

    size_t width = CGImageGetWidth(imgRef);
    size_t height = CGImageGetHeight(imgRef);
    const size_t bytesPerRow = width * 4;
    const size_t bitmapByteCount = bytesPerRow * height;
    size_t mas[bitmapByteCount];
    UInt8* data = (UInt8*)CGBitmapContextGetData(bmContext);

      for (size_t i = 0; i < bitmapByteCount; i +=4)
        {
            UInt8 a = data[i];
            UInt8 r = data[i + 1];
            UInt8 g = data[i + 2];
            UInt8 b = data[i + 3];

            mas[i]   = a;
            mas[i+1] = r;
            mas[i+2] = g;
            mas[i+3] = b;        

        }

1 个答案:

答案 0 :(得分:0)

通常,使用内置图像绘制API比编写自己的图像处理代码更快,更不容易出错。上述代码中至少存在三个潜在错误:

  • 它假设在行的末尾没有填充(iOS似乎填充了16个字节的倍数);你需要使用CGImageGetBytesPerRow()。
  • 它采用固定的像素格式。
  • 它从CGImage获取宽度/高度,但从CGBitmapContext获取数据。

假设你有一个UIImage,

CGRect r = {{0,0},img.size};
r.size.width *= 2;
r.size.height *= 2;
UIGraphicsBeginImageContext(r.size);
// This turns off interpolation in order to do pixel-doubling.
CGContextSetInterpolationQuality(UIGraphicsGetCurrentContext(), kCGInterpolationNone);
[img drawRect:r];
UIImage * bigImg = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();