0

その画像のすべてのピクセルを読み取り、ピクセルデータを灰色に置き換える部分的なグレースケール画像を作成しようとしています。ピクセルの色が目的の色と一致する場合、特定の色が適用されるように制限しますピクセルの色が変わりません。どこが間違っているのかわかりません。画像全体がグレースケールに変わり、画像が 90 度回転します。事前に感謝します。

-(UIImage *) toPartialGrayscale{
const int RED = 1;
const int GREEN = 2;
const int BLUE = 3;

initialR=255.0;
initialG=0.0;
initialB=0.0;//218-112-214//0-191-255
float r;
float g;
float b;
tollerance=50;

// Create image rectangle with current image width/height
CGRect imageRect = CGRectMake(0, 0, originalImageView.image.size.width * scale, originalImageView.image.size.height * scale);

int width = imageRect.size.width;
int height = imageRect.size.height;

// the pixels will be painted to this array
uint32_t *pixels = (uint32_t *) malloc(width * height * sizeof(uint32_t));

// clear the pixels so any transparency is preserved
memset(pixels, 0, width * height * sizeof(uint32_t));

CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();

// create a context with RGBA pixels
CGContextRef context = CGBitmapContextCreate(pixels, width, height, 8, width * sizeof(uint32_t), colorSpace,
                                             kCGBitmapByteOrder32Little | kCGImageAlphaPremultipliedLast);

// paint the bitmap to our context which will fill in the pixels array
CGContextDrawImage(context, CGRectMake(0, 0, width, height), [originalImageView.image CGImage]);

for(int y = 0; y < height; y++)
{
    for(int x = 0; x < width; x++)
    {
        uint8_t *rgbaPixel = (uint8_t *) &pixels[y * width + x];

        // convert to grayscale using recommended method: http://en.wikipedia.org/wiki/Grayscale#Converting_color_to_grayscale
        uint8_t gray = (uint8_t) ((30 * rgbaPixel[RED] + 59 * rgbaPixel[GREEN] + 11 * rgbaPixel[BLUE]) / 100);

        // set the pixels to grayi

        r= initialR-rgbaPixel[RED];
        g= initialG-rgbaPixel[GREEN];
        b= initialB-rgbaPixel[BLUE];

        if ((r<tollerance&&r>-tollerance)&&(g<tollerance&&g>-tollerance)&&(b<tollerance&&b>-tollerance))
        {
            rgbaPixel[RED] = (uint8_t)r;
            rgbaPixel[GREEN] = (uint8_t)g;
            rgbaPixel[BLUE] = (uint8_t)b;
        }
        else
        {
            rgbaPixel[RED] = gray;
            rgbaPixel[GREEN] = gray;
            rgbaPixel[BLUE] = gray;
        }


    }
}

// create a new CGImageRef from our context with the modified pixels
CGImageRef image = CGBitmapContextCreateImage(context);

// we're done with the context, color space, and pixels
CGContextRelease(context);
CGColorSpaceRelease(colorSpace);
free(pixels);

// make a new UIImage to return
UIImage *resultUIImage = [UIImage imageWithCGImage:image
                                             scale:scale
                                       orientation:UIImageOrientationUp];

// we're done with image now too
CGImageRelease(image);

return resultUIImage;
}

これは、私があらゆる種類のヘルプを使用しているコードです。事前にもう一度感謝します。

4

1 に答える 1

0

UIImageOrientationUp最終的な画像を作成するときに渡す定数をいじることで、オリエンテーション ピースが簡単に解決できることを願っています。必要なものが得られるまで、左または右を試してください。

しきい値が機能していないことについては、「許容範囲」が実際に期待どおりに動作していることを確認できますか。それを 255 に変更し、画像全体がその色を保持しているかどうかを確認します (保持されるはずです)。それでも灰色の場合は、条件ステートメントに問題があることがわかります。

于 2013-10-28T15:02:34.243 に答える