-(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));
}
質問する
604 次
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 に答える