2012-04-20 5 views
2

Я не знаю, как это происходит, но когда я беру изображение с камеры в портретном режиме и загружаюсь на сервер, оно отображается отлично, но когда я беру то же изображение из библиотеки фотографий и загружаю на сервер, отображается в ландшафтном режиме.Проблема с UIImageOrientation при отправке на сервер

Не знаете, как это происходит? и очень застрял с последних 5 часов ..

Я прошел через this и this, но пока не получил успеха.

Помогите мне в решении этой проблемы?

Заранее спасибо.

UPDATE

- (UIImage *)imageToFitSize:(CGSize)fitSize method:(MGImageResizingMethod)resizeMethod 
{ 
    float imageScaleFactor = 1.0; 
#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 40000 
    if ([self respondsToSelector:@selector(scale)]) { 
     imageScaleFactor = [self scale]; 
    } 
#endif 

    float sourceWidth = [self size].width * imageScaleFactor; 
    float sourceHeight = [self size].height * imageScaleFactor; 
    float targetWidth = fitSize.width; 
    float targetHeight = fitSize.height; 
    BOOL cropping = !(resizeMethod == MGImageResizeScale); 

    // Calculate aspect ratios 
    float sourceRatio = sourceWidth/sourceHeight; 
    float targetRatio = targetWidth/targetHeight; 

    // Determine what side of the source image to use for proportional scaling 
    BOOL scaleWidth = (sourceRatio <= targetRatio); 
    // Deal with the case of just scaling proportionally to fit, without cropping 
    scaleWidth = (cropping) ? scaleWidth : !scaleWidth; 

    // Proportionally scale source image 
    float scalingFactor, scaledWidth, scaledHeight; 
    if (scaleWidth) { 
     scalingFactor = 1.0/sourceRatio; 
     scaledWidth = targetWidth; 
     scaledHeight = round(targetWidth * scalingFactor); 
    } else { 
     scalingFactor = sourceRatio; 
     scaledWidth = round(targetHeight * scalingFactor); 
     scaledHeight = targetHeight; 
    } 
    float scaleFactor = scaledHeight/sourceHeight; 

    // Calculate compositing rectangles 
    CGRect sourceRect, destRect; 
    if (cropping) { 
     destRect = CGRectMake(0, 0, targetWidth, targetHeight); 
     float destX, destY; 
     if (resizeMethod == MGImageResizeCrop) { 
      // Crop center 
      destX = round((scaledWidth - targetWidth)/2.0); 
      destY = round((scaledHeight - targetHeight)/2.0); 
     } else if (resizeMethod == MGImageResizeCropStart) { 
      // Crop top or left (prefer top) 
      if (scaleWidth) { 
       // Crop top 
       destX = 0.0; 
       destY = 0.0; 
      } else { 
       // Crop left 
       destX = 0.0; 
       destY = round((scaledHeight - targetHeight)/2.0); 
      } 
     } else if (resizeMethod == MGImageResizeCropEnd) { 
      // Crop bottom or right 
      if (scaleWidth) { 
       // Crop bottom 
       destX = round((scaledWidth - targetWidth)/2.0); 
       destY = round(scaledHeight - targetHeight); 
      } else { 
       // Crop right 
       destX = round(scaledWidth - targetWidth); 
       destY = round((scaledHeight - targetHeight)/2.0); 
      } 
     } 
     sourceRect = CGRectMake(destX/scaleFactor, destY/scaleFactor, 
           targetWidth/scaleFactor, targetHeight/scaleFactor); 
    } else { 
     sourceRect = CGRectMake(0, 0, sourceWidth, sourceHeight); 
     destRect = CGRectMake(0, 0, scaledWidth, scaledHeight); 
    } 

    // Create appropriately modified image. 
    UIImage *image = nil; 
#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 40000 
    if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 4.0) { 
     UIGraphicsBeginImageContextWithOptions(destRect.size, NO, 0.0); // 0.0 for scale means "correct scale for device's main screen". 

     CGImageRef sourceImg; 

     if(resizeMethod == MGImageResizeCrop) 
      sourceImg = CGImageCreateWithImageInRect([self CGImage], sourceRect); // cropping happens here. 
     else 
      sourceImg = CGImageRetain([self CGImage]);  // scaling happens here. 

     image = [UIImage imageWithCGImage:sourceImg scale:0.0 orientation:self.imageOrientation]; // create cropped UIImage. 
     [image drawInRect:destRect]; // the actual scaling happens here, and orientation is taken care of automatically. 
     CGImageRelease(sourceImg); 
     image = UIGraphicsGetImageFromCurrentImageContext(); 
     UIGraphicsEndImageContext(); 
    } 
#endif 
    if (!image) { 
     // Try older method. 
     CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); 
     CGContextRef context = CGBitmapContextCreate(NULL, fitSize.width, fitSize.height, 8, (fitSize.width * 4), 
                colorSpace, kCGImageAlphaPremultipliedLast); 

     CGImageRef sourceImg; 
     if(resizeMethod == MGImageResizeCrop) 
      sourceImg = CGImageCreateWithImageInRect([self CGImage], sourceRect); // cropping happens here. 
     else 
      sourceImg = CGImageRetain([self CGImage]);  // scaling happens here. 

     //CGImageRef sourceImg = CGImageCreateWithImageInRect([self CGImage], sourceRect); 
     CGContextDrawImage(context, destRect, sourceImg); 
     CGImageRelease(sourceImg); 
     CGImageRef finalImage = CGBitmapContextCreateImage(context); 
     CGContextRelease(context); 
     CGColorSpaceRelease(colorSpace); 
     image = [UIImage imageWithCGImage:finalImage]; 
     CGImageRelease(finalImage); 
    } 

    return image; 
} 

Где MGImageResizingMethod это перечисление, что я определил и переходя MGImageResizeScale в качестве аргумента в функции.

+0

делать масштаб только не вращать .. –

+0

@CocoaMatters см. обновленный ответ –

ответ

0

попробуйте, возможно, это работает. вы должны установить условие, согласно изображение как

if(image == fromCamera){ 
    [image fixOrientation]; 
} 
else{ 
//please do not convert it to orientation 
} 
Смежные вопросы