1

画像をトリミングして、画像の他の部分を取得したい。以下の画像のように

ここに画像の説明を入力

ここに画像の説明を入力

ここでは、画像の選択部分の透明領域を作成し、新しい画像を作成します。

また、すべてのピクセルを取得して、選択部分のアルファを 0 に設定しようとしましたが、うまくいきませんでした。

他の解決策はありますか?

これが私が使用したコードです:

CGSize size = [UIImage imageNamed:fileName].size;
CGImageRef inImage = [UIImage imageNamed:fileName].CGImage;
CFDataRef ref = CGDataProviderCopyData(CGImageGetDataProvider(inImage));
UInt8 * buf = (UInt8 *) CFDataGetBytePtr(ref);
int length = CFDataGetLength(ref);
float value2 =  (1 + value-0.5);
NSLog(@"length  = %d",length);
int row = 0,col = 0;
for(int i=0; i<length; i+=4)
{

    int r = i;
    int g = i+1;
    int b = i+2;
    int a = i+3;


    col++;
    if ((col % (int)size.width)==0 ) {
        row++;
        col=0;
    }


    int red = buf[r];
    int green = buf[g];
    int blue = buf[b];
    int alpha = buf[a]; 


    if (col > 25 && col < 75 && row > 25 && row < 75) {
        alpha = 0;
    }


    buf[r] = SAFECOLOR(red);
    buf[g] = SAFECOLOR(green);
    buf[b] = SAFECOLOR(blue);
    buf[a] = SAFECOLOR(alpha);


}
NSLog(@"CGImageGetAlphaInfo %d",CGImageGetAlphaInfo(inImage));
NSLog(@"CGImageGetColorSpace %@",CGImageGetColorSpace(inImage));

CGContextRef ctx = CGBitmapContextCreate(buf,
                                         CGImageGetWidth(inImage),
                                         CGImageGetHeight(inImage),
                                         CGImageGetBitsPerComponent(inImage),
                                         CGImageGetBytesPerRow(inImage),
                                         kCGColorSpaceGenericRGB,
                                         kCGImageAlphaPremultipliedLast);

CGImageRef img = CGBitmapContextCreateImage(ctx);

imgView.image = [UIImage imageWithCGImage:img];
4

1 に答える 1

0

透明な長方形をペイントしてみてくださいkCGBlendModeCopy(宛先ピクセルとブレンドするのではなく、完全に置き換えます)

UIImage* dst = [UIImage imageNamed:fileName];
UIGraphicsBeginImageContext(dst.size);
[dst drawInRect:CGRectMake(0,0,dst.size.width,dst.size.height)];
[[UIBezierPath bezierPathWithRect:CGRectMake(25,25,50,50)] 
 fillWithBlendMode:kCGBlendModeCopy alpha:0];
UIImage* result = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();

ソリューションの問題は、アルファが事前に乗算されたビットマップでは、R、G、BコンポーネントがAコンポーネントで乗算されると予想されることです。つまり、Aをゼロに設定する場合は、R、G、Bをゼロに設定する必要があります。 (A = 0を掛けた値はゼロになるため)。

于 2012-05-29T12:25:54.150 に答える