2012-12-17 25 views
1

我試圖從iPhone上傳攝像機圖像到我的網絡服務器,但一些圖像如何改變它的方向,當我從服務器上下載它們時。這隻發生在相機圖像上,而不是簡單的圖像上傳從我的機器到設備。Plz幫助我。iphone圖像從服務器下載時得到旋轉

我有使用該條件對服務器側旋轉圖像:

//物鏡將被取向通過在上載服務器上的圖像將其值是1或-3或6或8

switch ((ushort)obj) 
               { 
                   case 1: //up 
                       return 0; 
                   case 3: //down 
                       return 180; 
                   case 6: //left 
                       return 90; 
                   case 8: //right 
                       return 270; 
                   default: 
                       return 0; 
               } 

不過還是我得到了同樣的問題

這裏是我的上傳圖片代碼:

-(void)uploadSingleFile 
{ 
    if(!self.objWebServices.bSyncWasOn) 
    { 
     NSLog(@"STOP upload Single File RETURN"); 
     [self Call_SaveSyncedImageID]; 
     return; 
    } 
    SyncItem* item = [arrSelSyncItemIDS objectAtIndex:nSyncItemIndex]; 

    if(item.nType == SYNC_STATUS_NOT_SELECTED || item.nType == SYNC_STATUS_SYNC_DONE) 
    { 
     nSyncItemIndex = nSyncItemIndex + 1; 
     if([arrSelSyncItemIDS count] > nSyncItemIndex) 
     { 
      NSLog(@"Called uploadSingleFile"); 
      [self uploadSingleFile]; 
      return; 
     } 
     else 
     { 
      //[self LoadImages:!bShowHideSyncImages]; 
      [SVProgressHUD dismiss]; 
      [BtnStopSync setTitle:@"Start sync" forState:UIControlStateNormal]; 
      self.objWebServices.bSyncWasOn = NO; 
      self.objWebServices.isFileUpload = NO; 

      if([[NSUserDefaults standardUserDefaults] boolForKey:@"Notification_State"]) // Setting Switch Bool 
      { 
       UIAlertView *Alert = [[UIAlertView alloc] initWithTitle:@"winkflash" message:@"*** Sync completed successfully." delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil]; 
       [Alert show]; 
      } 
     } 
    } 
    NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults]; 
    NSString *srtprefSessionId = [NSString stringWithFormat:@"%@",[prefs objectForKey:@"prefSessionId"]]; 

    BOOL isTrash = FALSE; 
    NSString *StrPath = @"/Pictures/";  //Change 
    ALAsset* temp = item.itemAsset; 
    NSDate* assetDate = (NSDate*)[temp valueForProperty:@"ALAssetPropertyDate"]; 

    NSString* strID = @""; 
    strID = [[temp valueForProperty:@"ALAssetPropertyURLs"] description]; 
    strID = [strID stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]; 

    NSString* strImageType = @""; 
    if ([strID rangeOfString:@"jpg"].location != NSNotFound || [strID rangeOfString:@"JPG"].location != NSNotFound){ 
     strImageType = @"jpg"; 
    } 
    else if ([strID rangeOfString:@"png"].location != NSNotFound || [strID rangeOfString:@"PNG"].location != NSNotFound) 
     strImageType = @"png"; 


    NSDateFormatter* df = [[NSDateFormatter alloc]init]; 
    [df setDateFormat:@"MM/dd/yyyy"]; 
    NSString *result = [df stringFromDate:assetDate]; 

    NSTimeInterval timeInterval = [assetDate timeIntervalSince1970]; 
    ALAssetRepresentation *rep = [temp defaultRepresentation]; 

    //------------------ metadata ------------------------------------------------------- 
    NSDictionary *imageMetadata = [rep metadata]; 
    NSString *strOrt=[NSString stringWithFormat:@"%@",[imageMetadata valueForKey:@"Orientation"]]; 
    NSString *strOrientation; 

    if([strOrt isEqualToString:@"6"]) 
    { 
     [email protected]"1"; 
    } 
    if([strOrt isEqualToString:@"8"]) 
    { 
     [email protected]"3"; 
    } 
    if([strOrt isEqualToString:@"3"]) 
    { 
     [email protected]"6"; 
    } 
    if([strOrt isEqualToString:@"1"]) 
    { 
     [email protected]"8"; 
    } 
    NSLog(@"print strOrientation:%@",strOrientation); 
    //----------------------------------------------------------------------------------- 

    StrPath = [StrPath stringByAppendingFormat:@"%d.%@",(int)timeInterval,strImageType]; 
    UIImage *image = [UIImage imageWithCGImage:[rep fullResolutionImage]]; 
    NSData *dataObj = nil; 
    dataObj = UIImagePNGRepresentation(image); 
    NSString* StrFileData = [Base64 encode:dataObj]; 
    NSString* strFileHash = [dataObj md5Test]; 

    //---------------------------------------------------- 
    NSMutableDictionary *DictRequest = [[NSMutableDictionary alloc]init]; 
    [DictRequest setObject:srtprefSessionId forKey:@"SessionId"]; 
    [DictRequest setObject:StrPath forKey:@"Path"]; 
    [DictRequest setValue:[NSNumber numberWithBool:isTrash] forKey:@"UploadDirectlyToTrashbin"]; 
    [DictRequest setObject:StrFileData forKey:@"FileData"]; 
    [DictRequest setObject:strFileHash forKey:@"FileHash"]; 
    [DictRequest setObject:result forKey:@"DateCreated"]; 

    BOOL isNULL = [self stringIsEmpty:strOrientation]; 
    if(!isNULL) 
    { 
     [DictRequest setObject:strOrientation forKey:@"Orientation"]; 
    } 


    NSString *jsonString = [DictRequest JSONRepresentation]; 
    NSString *strUrl=[NSString stringWithFormat:@"%@",FileUpload_URL]; 
    NSURL *url1=[NSURL URLWithString:strUrl]; 
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url1]; 
    [request setTimeoutInterval:60.0]; 
    [request setHTTPMethod:@"POST"]; 
    NSData *postData = [jsonString dataUsingEncoding:NSASCIIStringEncoding allowLossyConversion:YES]; 
    NSString *postLength = [NSString stringWithFormat:@"%d",[postData length]]; 
    [request setHTTPBody:postData]; 
    [request setValue:postLength forHTTPHeaderField:@"Content-Length"]; 
    [request setValue:@"application/json" forHTTPHeaderField:@"Content-Type"]; 


    if(theConnection) 
     [self Set2Defaults]; 

    theConnection = [[NSURLConnection alloc]initWithRequest:request delegate:self]; 

    [SVProgressHUD dismiss]; 

    if(theConnection) 
     webData = [NSMutableData data]; 
    else 
     NSLog(@"Connection Failed !!!"); 
} 
+0

什麼樣的對象是'obj'?顯示更多的代碼,否則你永遠不會得到有用的答案。 – NSAddict

+0

你可以把你的代碼上傳圖片,所以我們可以更明白..可能是什麼問題? – SachinVsSachin

回答

8

這是由於UIImage中存儲的方向。

我在UIImage的一個類中使用了這個函數。

- (UIImage *)fixOrientation { 

    // No-op if the orientation is already correct 
    if (self.imageOrientation == UIImageOrientationUp) return self; 

    // We need to calculate the proper transformation to make the image upright. 
    // We do it in 2 steps: Rotate if Left/Right/Down, and then flip if Mirrored. 
    CGAffineTransform transform = CGAffineTransformIdentity; 

    switch (self.imageOrientation) { 
     case UIImageOrientationDown: 
     case UIImageOrientationDownMirrored: 
      transform = CGAffineTransformTranslate(transform, self.size.width, self.size.height); 
      transform = CGAffineTransformRotate(transform, M_PI); 
      break; 

     case UIImageOrientationLeft: 
     case UIImageOrientationLeftMirrored: 
      transform = CGAffineTransformTranslate(transform, self.size.width, 0); 
      transform = CGAffineTransformRotate(transform, M_PI_2); 
      break; 

     case UIImageOrientationRight: 
     case UIImageOrientationRightMirrored: 
      transform = CGAffineTransformTranslate(transform, 0, self.size.height); 
      transform = CGAffineTransformRotate(transform, -M_PI_2); 
      break; 
     case UIImageOrientationUp: 
     case UIImageOrientationUpMirrored: 
      break; 
    } 

    switch (self.imageOrientation) { 
     case UIImageOrientationUpMirrored: 
     case UIImageOrientationDownMirrored: 
      transform = CGAffineTransformTranslate(transform, self.size.width, 0); 
      transform = CGAffineTransformScale(transform, -1, 1); 
      break; 

     case UIImageOrientationLeftMirrored: 
     case UIImageOrientationRightMirrored: 
      transform = CGAffineTransformTranslate(transform, self.size.height, 0); 
      transform = CGAffineTransformScale(transform, -1, 1); 
      break; 
     case UIImageOrientationUp: 
     case UIImageOrientationDown: 
     case UIImageOrientationLeft: 
     case UIImageOrientationRight: 
      break; 
    } 

    // Now we draw the underlying CGImage into a new context, applying the transform 
    // calculated above. 
    CGContextRef ctx = CGBitmapContextCreate(NULL, self.size.width, self.size.height, 
              CGImageGetBitsPerComponent(self.CGImage), 0, 
              CGImageGetColorSpace(self.CGImage), 
              CGImageGetBitmapInfo(self.CGImage)); 
    CGContextConcatCTM(ctx, transform); 
    switch (self.imageOrientation) { 
     case UIImageOrientationLeft: 
     case UIImageOrientationLeftMirrored: 
     case UIImageOrientationRight: 
     case UIImageOrientationRightMirrored: 
      // Grr... 
      CGContextDrawImage(ctx, CGRectMake(0,0,self.size.height,self.size.width), self.CGImage); 
      break; 

     default: 
      CGContextDrawImage(ctx, CGRectMake(0,0,self.size.width,self.size.height), self.CGImage); 
      break; 
    } 

    // And now we just create a new UIImage from the drawing context 
    CGImageRef cgimg = CGBitmapContextCreateImage(ctx); 
    UIImage *img = [UIImage imageWithCGImage:cgimg]; 
    CGContextRelease(ctx); 
    CGImageRelease(cgimg); 
    return img; 
} 

從imagePicker獲取圖像時運行此操作。

然後當你上傳和下載它將保持方向。

+0

我沒有從圖像選取器首次獲取圖像我已經加載從我的卡馬拉galary到我的應用程序的所有圖像,並獲得所有圖像後,我已經選擇在服務器上傳圖像 – mshau

+0

雖然這個問題仍然是相同的。 UIImage存儲單獨的數據,告訴應用程序顯示的方向。你的服務器沒有。當您再次下載圖像時,方向數據消失,您得到錯誤的方向。您可以嘗試修復服務器端或在上傳之前在圖像上使用此類別:D – Fogmeister

+0

我應該在哪裏調用此函數 - (UIImage *)fixOrientation {@Fogmeister – mshau

2

試試這個:

UIImage *sourceImage = ... // Our image 
CGRect selectionRect = CGRectMake(100.0, 100.0, 300.0, 400.0); 
CGImageRef resultImageRef = CGImageCreateWithImageInRect(sourceImage.CGImage, 
selectionRect); 
UIImage *resultImage = [[UIImage alloc] initWithCGImage:resultImageRef]; 

而且

CGRect TransformCGRectForUIImageOrientation(CGRect source, UIImageOrientation orientation, CGSize imageSize) { 
switch (orientation) { 
case UIImageOrientationLeft: { // EXIF #8 
    CGAffineTransform txTranslate = CGAffineTransformMakeTranslation(imageSize.height, 0.0); 
    CGAffineTransform txCompound = CGAffineTransformRotate(txTranslate,M_PI_2); 
    return CGRectApplyAffineTransform(source, txCompound); 
} 
case UIImageOrientationDown: { // EXIF #3 
    CGAffineTransform txTranslate = CGAffineTransformMakeTranslation(imageSize.width, imageSize.height); 
    CGAffineTransform txCompound = CGAffineTransformRotate(txTranslate,M_PI); 
    return CGRectApplyAffineTransform(source, txCompound); 
} 
case UIImageOrientationRight: { // EXIF #6 
    CGAffineTransform txTranslate = CGAffineTransformMakeTranslation(0.0, imageSize.width); 
    CGAffineTransform txCompound = CGAffineTransformRotate(txTranslate,M_PI + M_PI_2); 
    return CGRectApplyAffineTransform(source, txCompound); 
} 
case UIImageOrientationUp: // EXIF #1 - do nothing 
    default: // EXIF 2,4,5,7 - ignore 
    return source; 
} 
} 
    ... 
UIImage *sourceImage = ... // Our image 
CGRect selectionRect = CGRectMake(100.0, 100.0, 300.0, 400.0); 
CGRect transformedRect = TransformCGRectForUIImageOrientation(selectionRect, sourceImage.imageOrientation, sourceImage.size); 
CGImageRef resultImageRef = CGImageCreateWithImageInRect(sourceImage.CGImage, transformedRect); 
UIImage *resultImage = [[UIImage alloc] initWithCGImage:resultImageRef]; 
相關問題