-(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));
}
ответ
Вы получаете байты в строке, но вы не используете его. Изображения могут иметь дополнительное дополнение в конце каждой строки. (Это характерно для изображений, которые имеют нечетную ширину.) Вы могли бы написать что-то вроде этого:
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
вписывается в междунар. Если у вас есть 4 канала с плавающей запятой в изображении, это может и не быть.
Не могли бы вы заменить весь этот неприятный код одним звонком на imageWithCGImage:scale:orientation:
, как описано here?
UIImage *flipped = [UIImage imageWithCGImage:imag.CGImage scale:1.0 orientation:UIImageOrientationDown];
Вы, возможно, потребуется изменить значение ориентации к другой в зависимости от того, что вы после- «флип» является немного неоднозначным.
Нет проблем с кодом, я внедрил ваш код и получил флип-образ.
вот мой код.
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];
> У меня есть эта проблема. в iOS 6 CFDataRef не поддерживает так вместо CFDataRef 'dataref = CopyImagePixels (img1);' я использую 'CFMutableDataRef dataref = CFDataCreateMutableCopy (0,0, CopyImagePixels (img1)); и теперь он работает как на iOS 5, так и на iOS 6 ... спасибо за попытку решить мою проблему ... –
Ваш wc @ bunti.iosdeveloper .. – Rajneesh071
Вы пытались отладить использование контрольных точек? Вы можете определить, в какой строке происходит сбой? – Krishnabhadra
@ Кришнабхадра, да, он будет разбиваться на петлю. –
@ Krishnabhadra да, он будет разбиваться на петлю. Первое время изображение перевернуто, но во второй раз это будет BAD ACCESS .. –