1

最初に画像を生のピクセルに変換し、再度ピクセルを UIImage に変換しました。画像を変換した後、色が変わり、透明になります。多くのことを試しましたが、問題は発生しませんでした。これが私のコードです:

-(UIImage*)markPixels:(NSMutableArray*)pixels OnImage:(UIImage*)image{
CGImageRef inImage = image.CGImage;
// Create off screen bitmap context to draw the image into. Format ARGB is 4 bytes for each pixel: Alpa, Red, Green, Blue
CGContextRef cgctx = [self createARGBBitmapContextFromImage:inImage];
if (cgctx == NULL) { return nil; /* error */ }
    size_t w = CGImageGetWidth(inImage);
size_t h = CGImageGetHeight(inImage);
CGRect rect = {{0,0},{w,h}};
// Draw the image to the bitmap context. Once we draw, the memory
// allocated for the context for rendering will then contain the
// raw image data in the specified color space.
CGContextDrawImage(cgctx, rect, inImage);
// Now we can get a pointer to the image data associated with the bitmap
// context.
int r = 3;
int p = 2*r+1;
unsigned char* data = CGBitmapContextGetData (cgctx);
int i = 0;
while (data[i]&&data[i+1]) {
    //        NSLog(@"%d",pixels[i]);
    i++;
}
NSLog(@"%d %zd %zd",i,w,h);
NSLog(@"%ld",sizeof(CGBitmapContextGetData (cgctx)));
for(int i = 0; i< pixels.count-1 ; i++){
    NSValue*touch1  = [pixels objectAtIndex:i];
    NSValue*touch2  = [pixels objectAtIndex:i+1];
    NSArray *linePoints = [self returnLinePointsBetweenPointA:[touch1 CGPointValue] pointB:[touch2 CGPointValue]];
    for(NSValue *touch in linePoints){
        NSLog(@"point = %@",NSStringFromCGPoint([touch CGPointValue]));
        CGPoint location = [touch CGPointValue];
        for(int i = -r ; i<p ;i++)
            for(int j= -r; j<p;j++)
            {
                if(i<=0 && j<=0 && i>image.size.height && j>image.size.width)
                    continue;
                NSInteger index = (location.y+i) * w*4 + (location.x+j)* 4;
                index = 0;
                data[index +3] = 125;
            }
    }
}
// When finished, release the context
CGContextRelease(cgctx);
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
CGDataProviderRef dp = CGDataProviderCreateWithData(NULL, data, w*h*4, NULL);
CGImageRef img = CGImageCreate(w, h, 8, 32, 4*w, colorSpace, kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big, dp, NULL, NO, kCGRenderingIntentDefault);
UIImage* ret_image = [UIImage imageWithCGImage:img];
CGImageRelease(img);
CGColorSpaceRelease(colorSpace);
// Free image data memory for the context
if (data) { free(data); }
return ret_image;
}


ここに画像の説明を入力ここに画像の説明を入力
1枚目は元の画像で、2枚目はこのコードを適用した後の画像です。

4

1 に答える 1

1

アルファを使用するかどうか、およびピクセルごとのコンポーネントの形式を CGImageRef に問い合わせる必要があります。すべての CGImageGet... 関数を参照してください。ほとんどの場合、画像は ARGB ではなく BGRA です。

私はしばしば純粋な緑色の画像を作成してレンダリングし、最初のピクセルを印刷して、正しく取得したことを確認します (BGRA -> 0 255 0 255) など。ホストの順序などと最初または最後にアルファを使用すると、本当に混乱します (ホストの前という意味ですか)。注文は前または後に適用されますか?)

編集: CGDataProviderCreateWithData に 'kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big' ですが、元のイメージにどのように構成されているかを尋ねているようには見えません。私の推測では、「kCGBitmapByteOrder32Big」を「kCGBitmapByteOrder32Little」に変更すると問題は解決しますが、アルファも間違っている可能性があります。

画像はアルファとバイトオーダーの値が異なる可能性があるため、元の画像にどのように構成されているかを尋ねてから、それに適応する必要があります (または、メモリ内のバイトを必要な形式に再マップします)。

于 2012-09-05T13:23:44.413 に答える