2

この質問で尋ねられていることと同様のことをしようとしていますが、その質問に対する答えがよくわかりません。それが必要なものかどうかわかりません。

必要なものは単純ですが、簡単かどうかはわかりません。画面上の特定の色のピクセル数を計算したい。私たちが見ている各「ピクセル」は、実際には、たとえば緑色に見えるさまざまな色のピクセルの組み合わせであることを理解しています. だから私が必要とするのは、実際の色、つまりユーザーが見る色です。

たとえば、UIView を作成し、背景色を[UIColor greenColor]に設定し、その寸法を画面の領域の半分に設定した場合 (簡単にするためにステータス バーが非表示になっており、iPhone を使用していると仮定できます)、この「マジック メソッド」が 240 * 160 または 38,400 を返すことを期待してください - 画面の領域の半分。

誰もこの「魔法の方法」を書き出すとは思っていませんが、知りたいです

a) 可能であれば

b) もしそうなら、ほぼリアルタイムで行われれば

c) その場合、どこから始めればよいか。OpenGLでできると聞いたことがありますが、その分野での経験はありません。

Radif Sharafullin のおかげで、これが私の解決策です。

int pixelsFromImage(UIImage *inImage) {
    CGSize s = inImage.size;
    const int width = s.width;
    const int height = s.height;
    unsigned char* pixelData = malloc(width * height);

    int pixels = 0;

    CGContextRef context = CGBitmapContextCreate(pixelData,
                                                  width,            
                                                  height,            
                                                  8,           
                                                  width,            
                                                  NULL,            
                                                  kCGImageAlphaOnly);

    CGContextClearRect(context, CGRectMake(0, 0, width, height));

    CGContextDrawImage(context, CGRectMake(0, 0, width, height), inImage.CGImage );

    CGContextRelease(context);

    for(int idx = 0; idx < width * height; ++idx) {
        if(pixelData[idx]) {
            ++pixels;
        }
    }

    free(pixelData);

    return pixels;
}
4

2 に答える 2

4

可能です。step透明ピクセルのパーセンテージを計算するために同様のことを行いましたが、大まかな見積もりが必要だったので、各ピクセルではなく、以下のコードの変数である10 ピクセルごとに調べていました。

BOOL isImageErased(UIImage *inImage, float step, int forgivenessCount){
CGSize s = inImage.size;
int width = s.width;  
int height = s.height;   
unsigned char*  pixelData = malloc( width * height );  
int forgivenessCounter=0;


CGContextRef context = CGBitmapContextCreate ( pixelData,  
                                              width,            
                                              height,            
                                              8,           
                                              width,            
                                              NULL,            
                                              kCGImageAlphaOnly );   
CGContextClearRect(context, CGRectMake(0, 0, width, height));
CGContextDrawImage( context, CGRectMake(0, 0, width, height), inImage.CGImage );  
CGContextRelease( context );  
for (int x=0; x<width; x=x+step) {
    for (int y=0; y<height; y=y+step) {

        if(pixelData[y * width + x]) {
            forgivenessCounter++;
            if (forgivenessCounter==forgivenessCount) {
                free(pixelData);
                return FALSE;
            }

        };

    }
}



free( pixelData );

return TRUE;}

前処理されたグレースケール画像を渡すかkCGImageAlphaOnly、API の設定を変更すると、このコードを目的に使用できると思います。

それが役立つことを願っています

于 2012-07-24T19:20:13.230 に答える
0

Swift 3で書かれた eric.mitchell ソリューション

func pixelsFromImage(inImage: UIImage) -> Int {

    let width = Int(inImage.size.width)
    let height = Int(inImage.size.height)

    let bitmapBytesPerRow = width
    let bitmapByteCount = bitmapBytesPerRow * height

    let pixelData = UnsafeMutablePointer<UInt8>.allocate(capacity: bitmapByteCount)

    let colorSpace = CGColorSpaceCreateDeviceGray()

    let context = CGContext(data: pixelData,
                            width: width,
                            height: height,
                            bitsPerComponent: 8,
                            bytesPerRow: bitmapBytesPerRow,
                            space: colorSpace,
                            bitmapInfo: CGBitmapInfo(rawValue: CGImageAlphaInfo.alphaOnly.rawValue).rawValue)!

    let rect = CGRect(x: 0, y: 0, width: width, height: height)
    context.clear(rect)
    context.draw(inImage.cgImage!, in: rect)

    var pixels = 0

    for x in 0...width {
        for y in 0...height {

            if pixelData[y * width + x] > 0 {
                pixels += 1
            }
        }
    }


    free(pixelData)

    return pixels
}
于 2016-12-12T15:18:41.163 に答える