-1

画像サイズが2x2なので、ピクセル数= 4

1ピクセル-4バイト

したがって、16バイトの配列があります--mas[16]-幅*高さ*4 = 16

同じ画像を作りたいのですが、サイズが2倍になります。つまり、1つではなく4つのピクセルになります。

新しい配列のサイズは64バイトになります--newMas[16]-width* 2 * height * 2 * 4

問題は、ピクセルをnewMasに正しくコピーできないこと、異なるサイズの画像でピクセルを正しくコピーすることです。 ここに画像の説明を入力してください

このコードはピクセルを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;        

        }
4

1 に答える 1

0

一般に、組み込みの画像描画 API を使用すると、独自の画像操作コードを作成するよりも高速でエラーが発生しにくくなります。上記のコードには、少なくとも 3 つの潜在的なエラーがあります。

  • 行の終わりにパディングがないことを前提としています (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();
于 2012-11-09T21:04:37.110 に答える