2012-10-16 1 views
-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)); 
} 
+0

Вы пытались отладить использование контрольных точек? Вы можете определить, в какой строке происходит сбой? – Krishnabhadra

+0

@ Кришнабхадра, да, он будет разбиваться на петлю. –

+0

@ Krishnabhadra да, он будет разбиваться на петлю. Первое время изображение перевернуто, но во второй раз это будет BAD ACCESS .. –

ответ

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 вписывается в междунар. Если у вас есть 4 канала с плавающей запятой в изображении, это может и не быть.

3

Не могли бы вы заменить весь этот неприятный код одним звонком на imageWithCGImage:scale:orientation:, как описано here?

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

Вы, возможно, потребуется изменить значение ориентации к другой в зависимости от того, что вы после- «флип» является немного неоднозначным.

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]; 
+1

> У меня есть эта проблема. в iOS 6 CFDataRef не поддерживает так вместо CFDataRef 'dataref = CopyImagePixels (img1);' я использую 'CFMutableDataRef dataref = CFDataCreateMutableCopy (0,0, CopyImagePixels (img1)); и теперь он работает как на iOS 5, так и на iOS 6 ... спасибо за попытку решить мою проблему ... –

+0

Ваш wc @ bunti.iosdeveloper .. – Rajneesh071

 Смежные вопросы

  • Нет связанных вопросов^_^