-1
-(UIImage * ) flipImage: (UIImage * ) imag {
    CGImageRef img1 = imag.CGImage;
    CFDataRef dataref = CopyImagePixels(img1);
    UInt8 * data = (UInt8 * ) CFDataGetBytePtr(dataref);
    int length = CFDataGetLength(dataref);
    size_t width = CGImageGetWidth(img1);
    size_t height = CGImageGetHeight(img1);
    size_t bytesPerRow = CGImageGetBytesPerRow(img1);
    size_t bitsPerComponent = CGImageGetBitsPerComponent(img1);
    size_t bitsPerPixel = CGImageGetBitsPerPixel(img1);
    NSLog(@"size %d x %d pixel:%d   component :%d length:%d", (int) width * 4, (int) height, (int) bitsPerPixel, (int) bitsPerComponent, length);
    int temp;
    for (int i = 0; i < height / 2; i++) {
        for (int j = 0; j < (width * 4); j++) {
            temp = (int) data[i * width * 4 + j];
            NSLog(@"first data :%ld  second data:%ld", i * width * 4 + j, width * 4 * (height - 1 - i) + j);
            data[i * width * 4 + j] = data[(width * 4 * (height - 1 - i)) + j];
            data[(width * 4 * (height - 1 - i)) + j] = (size_t) temp;
        }
    }
    CGColorSpaceRef colorspace = CGImageGetColorSpace(img1);
    CGBitmapInfo bitmapInfo = CGImageGetBitmapInfo(img1);
    CFDataRef newData = CFDataCreate(NULL, data, length);
    CGDataProviderRef provider = CGDataProviderCreateWithCFData(newData);
    CGImageRef newImg = CGImageCreate(width, height, bitsPerComponent, bitsPerPixel, bytesPerRow, colorspace, bitmapInfo, provider, NULL, true, kCGRenderingIntentDefault);
    //[imvcomment setImage:[UIImage imageWithCGImage:newImg]];
    return [UIImage imageWithCGImage: newImg];
    CGImageRelease(newImg);
    CGDataProviderRelease(provider);
}

CFDataRef CopyImagePixels(CGImageRef inImage) {
    return CGDataProviderCopyData(CGImageGetDataProvider(inImage));
}
4

3 に答える 3

3

ここでimageWithCGImage:scale:orientation:説明されているように、この見苦しいコードをすべて への 1 回の呼び出しに置き換えることはできませんか?

UIImage *flipped = [UIImage imageWithCGImage:imag.CGImage scale:1.0 orientation:UIImageOrientationDown];

あなたが何をしているかに応じて、向きの値を別のものに変更する必要があるかもしれません.「フリップ」は少しあいまいです.

于 2012-10-16T06:07:18.387 に答える
0

行ごとのバイト数を取得していますが、使用していません。画像には、各行の最後に追加のパディングが含まれる場合があります。(これは、幅が奇数の画像では一般的です。)次のように書くことができます。

for (i = 0; i < height / 2; i++)
{
    for (j = 0; j < width; j++)
    {
        temp = (int)data [ i * bytesPerRow + j ];
        data[i * bytesPerRow + j] = data[(bytesPerRow * (height - 1 - i)) + j];
        data[(bytesPerRow * (height - 1 - i)) + j] = (size_t) temp;
    }
}

bitsPerPixelまた、それがint内に収まるかどうかを確認することもできます。画像に4つの浮動小数点チャネルがある場合、そうではない可能性があります。

于 2012-10-16T05:15:23.113 に答える
0

コードに問題はありません。コードを実装し、フリップ イメージを取得しました。

これが私のコードです。

UIImage *imgg = [UIImage imageNamed:@"route.png"];

UIImageView *image = [[UIImageView alloc]init];
image.frame=CGRectMake(50, 50, 100, 50);
[self.view addSubview:image];

image.image  =  [self flipImage:imgg];
于 2012-10-16T06:47:50.600 に答える