iOS UIImagePickerController ফলাফল আপলোডের পরে চিত্রের ওরিয়েন্টেশন


332

আমি আমার আইফোনের অ্যাপ্লিকেশনটি একটি আইওএস 3.1.3 আইফোনে পরীক্ষা করছি। আমি একটি ব্যবহার করে একটি চিত্র নির্বাচন / ক্যাপচার করছিUIImagePickerController :

UIImagePickerController *imagePicker = [[UIImagePickerController alloc] init];
[imagePicker setSourceType:UIImagePickerControllerSourceTypeCamera];
[imagePicker setDelegate:self];
[self.navigationController presentModalViewController:imagePicker animated:YES];
[imagePicker release];



- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info {
    self.image = [info objectForKey:UIImagePickerControllerOriginalImage];
    imageView.image = self.image;
    [self.navigationController dismissModalViewControllerAnimated:YES];
    submitButton.enabled = YES;
}

আমি তখন একসময় এএসআই ক্লাস ব্যবহার করে এটি আমার ওয়েব সার্ভারে প্রেরণ করি:

ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:[NSURL URLWithString:@"http://example.com/myscript.php"]];
[request setDelegate:self];
[request setStringEncoding:NSUTF8StringEncoding];
[request setShouldContinueWhenAppEntersBackground:YES];
//other post keys/values
[request setFile:UIImageJPEGRepresentation(self.image, 100.0f) withFileName:[NSString stringWithFormat:@"%d.jpg", [[NSDate date] timeIntervalSinceNow]] andContentType:@"image/jpg" forKey:@"imageFile"];
[request startAsynchronous];

সমস্যা: আমি আইফোনটিকে যখন ল্যান্ডস্কেপ ধরে রাখার সময় ছবি তুলি, তখন ছবিটি সার্ভারে আপলোড হয়ে যায় এবং এটি আপনার প্রত্যাশা মতো দেখা যায়। প্রতিকৃতিতে ফোন ধারণ করে ছবি তোলার সময় ছবিটি আপলোড করা হয় এবং 90 ডিগ্রি ঘোরাফেরা করা হয়েছে বলে দেখা হয়।

আমার অ্যাপ্লিকেশনটি কেবল প্রতিকৃতি মোডে (আপসাইডাউন এবং নিয়মিত) কাজ করতে সেট করা আছে।

আমি কীভাবে চিত্রটি আপলোডের পরে সর্বদা সঠিক দিকনির্দেশনাটি প্রদর্শন করতে পারি?

চিত্রটি ইউআইআইমেজভিউতে প্রদর্শিত হিসাবে সঠিক বলে মনে হচ্ছে (সরাসরি ছবি তোলার পরে), তবে সার্ভারে দেখা অন্যথায় বলে।

উত্তর:


513

UIImageএর একটি সম্পত্তি রয়েছে imageOrientationযা কাঁচা চিত্রের ডেটা ঘোরানোর জন্য UIImageViewএবং অন্যান্য UIImageগ্রাহকদের নির্দেশ দেয় । এই পতাকাটি আপলোড করা জেপিইগ চিত্রের এক্সিফ ডেটাতে সংরক্ষণ করা হচ্ছে এমন একটি ভাল সুযোগ রয়েছে তবে আপনি যে প্রোগ্রামটি এটি দেখতে ব্যবহার করেন সেটি সেই পতাকাটিকে সম্মান করছে না।

ঘোরানো UIImageআপলোড করার সময় সঠিকভাবে প্রদর্শনের , আপনি এই জাতীয় বিভাগটি ব্যবহার করতে পারেন:

UIImage + + fixOrientation.h

@interface UIImage (fixOrientation)

- (UIImage *)fixOrientation;

@end

UIImage + + fixOrientation.m

@implementation UIImage (fixOrientation)

- (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;
}

@end

9
ধন্যবাদ, নিখুঁত কাজ কখনও কোনও বিভাগ ব্যবহার করেন নি বা এখনও অবধি বোঝে নি!
জেমস

1
@ অ্যানমি আপনি কেবল আমাকে আমাকে কতটা খুশি করেছেন তা ব্যাখ্যা করা আমার পক্ষে কঠিন। আপনার উত্তর আমার দিন বাঁচায়। আপনাকে অনেক ধন্যবাদ.
দার্কশোর গ্রুপ

3
আমি একই চেষ্টা করেছি, নিখুঁতভাবে কাজ করে তবে 3264 * 2448 রেজোলিউশন চিত্রগুলি ঘোরতে অ্যাপেক্স 2-3 সেকেন্ড সময় নেয়। সুতরাং দয়া করে উন্নত সংস্করণ প্রস্তাব করুন।
লক্ষ্মী লাল মেনারিয়া

3
আমি বিবেচনা stackoverflow.com/questions/8915630/... একটি ভাল উত্তর
pojomx

2
এখনো এই সমস্যার অন্য সমাধান এখানে (বেশ এই এক অনুরূপ) যে আসলে হচ্ছেটা একটি সুদীর্ঘ আলোচনা অন্তর্ভুক্ত করা হয়েছে।
গ্যালিমন

239

আমি একটি খুব সহজ এক খুঁজে পেয়েছি:

- (UIImage *)normalizedImage {
    if (self.imageOrientation == UIImageOrientationUp) return self; 

    UIGraphicsBeginImageContextWithOptions(self.size, NO, self.scale);
    [self drawInRect:(CGRect){0, 0, self.size}];
    UIImage *normalizedImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return normalizedImage;
}

বিটিডাব্লু: @ অ্যানমির কোড আমলে নেয় না scale, তাই 2x চিত্রের জন্য কাজ করবে না।


আপনি কোডটিতে এটি কীভাবে ব্যবহার করবেন? আমার এটির একটি রয়েছে: ইউআইআইজেজজেপিপিইগ্রেশন (চিত্র, 90); যেখানে চিত্রটি একটি ইউআইআইমেজ রয়েছে
দেজেল

2
@ ওডেলিয়া এই পদ্ধতিটি আপনার ইউআইআইজেজ বিভাগে যুক্ত করুন তারপরে [চিত্রটিকে সাধারণীকরণ করুন] অথবা selfআপনার ইউআইআইমেজ অবজেক্টটি প্রতিস্থাপনের মাধ্যমে পদ্ধতির কোডটি সরাসরি ব্যবহার করুন ।
an0

1
@ an0 পদ্ধতিটি সময় নেয় যা প্রায় এক সেকেন্ড সময় নেয়। এটির উন্নতি করার কোনও উপায় আছে কি?
দেজেল

1
তার জন্য ধন্যবাদ। আমার পরীক্ষাগুলি থেকে দেখে মনে হচ্ছে এই পদ্ধতিটি নির্বাচিত উত্তরের চেয়ে কিছুটা দ্রুত, আমার আইফোন 4-তে 20% এর মতো কিছু।
ক্রিসবেন

7
এখনো এই সমস্যার অন্য সমাধান এখানে কি হচ্ছে একটি সুদীর্ঘ ব্যাখ্যার করেন।
গ্যালিমন

118

এখানে @ an0 দ্বারা উত্তরের একটি সুইফ্ট সংস্করণ দেওয়া হয়েছে:

func normalizedImage() -> UIImage {

  if (self.imageOrientation == UIImageOrientation.Up) { 
      return self;
  }

  UIGraphicsBeginImageContextWithOptions(self.size, false, self.scale);
  let rect = CGRect(x: 0, y: 0, width: self.size.width, height: self.size.height)
  self.drawInRect(rect)

  let normalizedImage : UIImage = UIGraphicsGetImageFromCurrentImageContext()
  UIGraphicsEndImageContext();
  return normalizedImage;
}

আরও সাধারণ কার্যক্রমে:

func fixOrientation(img:UIImage) -> UIImage {

  if (img.imageOrientation == UIImageOrientation.Up) { 
      return img;
  }

  UIGraphicsBeginImageContextWithOptions(img.size, false, img.scale);
  let rect = CGRect(x: 0, y: 0, width: img.size.width, height: img.size.height)
  img.drawInRect(rect)

  let normalizedImage : UIImage = UIGraphicsGetImageFromCurrentImageContext()
  UIGraphicsEndImageContext();
  return normalizedImage;

}

সুইফট 3 সংস্করণ:

func fixOrientation(img: UIImage) -> UIImage {
    if (img.imageOrientation == .up) {
        return img
    }

    UIGraphicsBeginImageContextWithOptions(img.size, false, img.scale)
    let rect = CGRect(x: 0, y: 0, width: img.size.width, height: img.size.height)
    img.draw(in: rect)

    let normalizedImage = UIGraphicsGetImageFromCurrentImageContext()!
    UIGraphicsEndImageContext()

    return normalizedImage
}

7
বিরল যে আপনাকে সেরা উত্তরের জন্য নীচে সমস্ত দিক স্ক্রোল করতে হবে। +1 টি!
sudo

আমার কোথায় ফিক্স ওরিয়েন্টেশন ব্যবহার করা উচিত? আমার একটি সেভিআইমেজ ফাংশন আছে, আমি কি এটি সেখানে বা আমার ইমেজহোল্ডার.আইমেজে ব্যবহার করব?
অ্যালেক্স

আপনি যদি উপরের আরও সাধারণ ফাংশনটি ব্যবহার করতে চান তবে হ্যাঁ আপনি এটি আপনার সেভ ইমেজ ফাংশনে ব্যবহার করতে পারেন। কেবলমাত্র আপনার ইউআইআইজেজ অবজেক্টের ফিক্স ওরিয়েন্টেশন পাস করুন এবং এটি আপনি যে ইউআইআইমেজ পাস করেছেন তার সঠিক ভিত্তিক সংস্করণটি ফিরিয়ে দেবে।
prajna

1
সুইফট 3 সংস্করণের জন্য ধন্যবাদ
শ্যাড্রস

41

ক্যামেরা থেকে চিত্র ক্যাপচার করার সময় ওরিয়েন্টেশন ইস্যুটির জন্য সুইফট ৩.১ এর সমাধান।

আমি জ্যাক এবং মেটাল হার্ট দ্বারা প্রদত্ত সমাধানটি আপডেট করেছি

ইউআইআইমেজ এক্সটেনশন

//MARK:- Image Orientation fix

extension UIImage {

    func fixOrientation() -> UIImage {

        // No-op if the orientation is already correct
        if ( self.imageOrientation == UIImageOrientation.up ) {
            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.
        var transform: CGAffineTransform = CGAffineTransform.identity

        if ( self.imageOrientation == UIImageOrientation.down || self.imageOrientation == UIImageOrientation.downMirrored ) {
            transform = transform.translatedBy(x: self.size.width, y: self.size.height)
            transform = transform.rotated(by: CGFloat(Double.pi))
        }

        if ( self.imageOrientation == UIImageOrientation.left || self.imageOrientation == UIImageOrientation.leftMirrored ) {
            transform = transform.translatedBy(x: self.size.width, y: 0)
            transform = transform.rotated(by: CGFloat(Double.pi / 2.0))
        }

        if ( self.imageOrientation == UIImageOrientation.right || self.imageOrientation == UIImageOrientation.rightMirrored ) {
            transform = transform.translatedBy(x: 0, y: self.size.height);
            transform = transform.rotated(by: CGFloat(-Double.pi / 2.0));
        }

        if ( self.imageOrientation == UIImageOrientation.upMirrored || self.imageOrientation == UIImageOrientation.downMirrored ) {
            transform = transform.translatedBy(x: self.size.width, y: 0)
            transform = transform.scaledBy(x: -1, y: 1)
        }

        if ( self.imageOrientation == UIImageOrientation.leftMirrored || self.imageOrientation == UIImageOrientation.rightMirrored ) {
            transform = transform.translatedBy(x: self.size.height, y: 0);
            transform = transform.scaledBy(x: -1, y: 1);
        }

        // Now we draw the underlying CGImage into a new context, applying the transform
        // calculated above.
        let ctx: CGContext = CGContext(data: nil, width: Int(self.size.width), height: Int(self.size.height),
                                                      bitsPerComponent: self.cgImage!.bitsPerComponent, bytesPerRow: 0,
                                                      space: self.cgImage!.colorSpace!,
                                                      bitmapInfo: self.cgImage!.bitmapInfo.rawValue)!;

        ctx.concatenate(transform)

        if ( self.imageOrientation == UIImageOrientation.left ||
            self.imageOrientation == UIImageOrientation.leftMirrored ||
            self.imageOrientation == UIImageOrientation.right ||
            self.imageOrientation == UIImageOrientation.rightMirrored ) {
            ctx.draw(self.cgImage!, in: CGRect(x: 0,y: 0,width: self.size.height,height: self.size.width))
        } else {
            ctx.draw(self.cgImage!, in: CGRect(x: 0,y: 0,width: self.size.width,height: self.size.height))
        }

        // And now we just create a new UIImage from the drawing context and return it
        return UIImage(cgImage: ctx.makeImage()!)
    }
}

সুইফট ২.০

//MARK:- Image Orientation fix

extension UIImage {

    func fixOrientation() -> UIImage {

        // No-op if the orientation is already correct
        if ( self.imageOrientation == UIImageOrientation.Up ) {
            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.
        var transform: CGAffineTransform = CGAffineTransformIdentity

        if ( self.imageOrientation == UIImageOrientation.Down || self.imageOrientation == UIImageOrientation.DownMirrored ) {
            transform = CGAffineTransformTranslate(transform, self.size.width, self.size.height)
            transform = CGAffineTransformRotate(transform, CGFloat(M_PI))
        }

        if ( self.imageOrientation == UIImageOrientation.Left || self.imageOrientation == UIImageOrientation.LeftMirrored ) {
            transform = CGAffineTransformTranslate(transform, self.size.width, 0)
            transform = CGAffineTransformRotate(transform, CGFloat(M_PI_2))
        }

        if ( self.imageOrientation == UIImageOrientation.Right || self.imageOrientation == UIImageOrientation.RightMirrored ) {
            transform = CGAffineTransformTranslate(transform, 0, self.size.height);
            transform = CGAffineTransformRotate(transform,  CGFloat(-M_PI_2));
        }

        if ( self.imageOrientation == UIImageOrientation.UpMirrored || self.imageOrientation == UIImageOrientation.DownMirrored ) {
            transform = CGAffineTransformTranslate(transform, self.size.width, 0)
            transform = CGAffineTransformScale(transform, -1, 1)
        }

        if ( self.imageOrientation == UIImageOrientation.LeftMirrored || self.imageOrientation == UIImageOrientation.RightMirrored ) {
            transform = CGAffineTransformTranslate(transform, self.size.height, 0);
            transform = CGAffineTransformScale(transform, -1, 1);
        }

        // Now we draw the underlying CGImage into a new context, applying the transform
        // calculated above.
        let ctx: CGContextRef = CGBitmapContextCreate(nil, Int(self.size.width), Int(self.size.height),
            CGImageGetBitsPerComponent(self.CGImage), 0,
            CGImageGetColorSpace(self.CGImage),
            CGImageGetBitmapInfo(self.CGImage).rawValue)!;

        CGContextConcatCTM(ctx, transform)

        if ( self.imageOrientation == UIImageOrientation.Left ||
            self.imageOrientation == UIImageOrientation.LeftMirrored ||
            self.imageOrientation == UIImageOrientation.Right ||
            self.imageOrientation == UIImageOrientation.RightMirrored ) {
                CGContextDrawImage(ctx, CGRectMake(0,0,self.size.height,self.size.width), self.CGImage)
        } else {
            CGContextDrawImage(ctx, CGRectMake(0,0,self.size.width,self.size.height), self.CGImage)
        }

        // And now we just create a new UIImage from the drawing context and return it
        return UIImage(CGImage: CGBitmapContextCreateImage(ctx)!)
    }
}

আপনার কোডে এই ইউআইআইজেজ এক্সটেনশনের ব্যবহার:

ফিক্স ওরিয়েন্টেশনআইমেজ = নির্বাচিত আইমেজ.ফিক্স ওরিয়েন্টেশন ()

এটি আপনার ইমেজ পিকারের প্রতিনিধি পদ্ধতিতে রাখুন

সুইফট ৩.১

//MARK: Image Picker Delegates
    func imagePickerController(
        _ picker: UIImagePickerController,
        didFinishPickingMediaWithInfo info: [String : Any]){
        let chosenImage = info[UIImagePickerControllerOriginalImage] as! UIImage
        profileImg.contentMode = .scaleAspectFill
        let fixOrientationImage=chosenImage.fixOrientation()
        profileImg.image = fixOrientationImage

        dismiss(animated: true, completion: nil)
    }

সুইফট ২.০

//MARK: Image Picker Delegates
    func imagePickerController(
        picker: UIImagePickerController,
        didFinishPickingMediaWithInfo info: [String : AnyObject])
    {
        let chosenImage = info[UIImagePickerControllerOriginalImage] as! UIImage
        profileImg.contentMode = .ScaleAspectFill
        **//Fix the image orientation**
         let fixOrientationImage=chosenImage.fixOrientation()
        profileImg.image = fixOrientationImage

        dismissViewControllerAnimated(true, completion: nil)
    }

3
ধন্যবাদ, এটি আমাকে অনেক সাহায্য করেছে।
অন্ধকার 26

আমার একটি ভিউকন্ট্রোলার আছে, আমি এটি সেখানে কোথায় রাখব?
অ্যাপ্লিক্রেশন

আরও সুনির্দিষ্টভাবে, আমি এটি সেখানে কোথায় রাখতে পারি এবং আমাকে এই পদ্ধতিটি কল করার দরকার কোথায়?
অ্যাপ্লিক্রেশন

এর কাজ। তবে আমি অবাক হচ্ছি যে এমন কোনও পদ্ধতি রয়েছে যা সিজি সম্পর্কিত এপিআই কল করা এড়াতে পারে, কারণ এর ফলে প্রচুর পরিমাণে মেমরি বরাদ্দ হয়। এটি কেবল তখনই প্রকাশিত হবে যখন আমরা আর ইউআইআইমেজ ধরে রাখি না।
টনি ফাং ছোই ফুং

1
এটি আইওএস 10 পর্যন্ত কাজ করে যাচ্ছিল IOS 11 এ সম্পাদন করার পরে আমি একটি কালো চিত্র পাচ্ছি image যদিও আমি একটি ছোট পরিবর্তন করেছি (ডাবলপিপি সহ এমএপিআই প্রতিস্থাপন)। আমি এক্সকোড 9টি সুইফট 3.2 এর সাথে ব্যবহার করছি।
মাহবুব মোর্শেদ

25

দ্রুতগতিতে;)

আপডেট সুইট 3.0: ডি

func sFunc_imageFixOrientation(img:UIImage) -> UIImage {


    // No-op if the orientation is already correct
    if (img.imageOrientation == UIImageOrientation.up) {
        return img;
    }
    // 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.
    var transform:CGAffineTransform = CGAffineTransform.identity

    if (img.imageOrientation == UIImageOrientation.down
        || img.imageOrientation == UIImageOrientation.downMirrored) {

        transform = transform.translatedBy(x: img.size.width, y: img.size.height)
        transform = transform.rotated(by: CGFloat(M_PI))
    }

    if (img.imageOrientation == UIImageOrientation.left
        || img.imageOrientation == UIImageOrientation.leftMirrored) {

        transform = transform.translatedBy(x: img.size.width, y: 0)
        transform = transform.rotated(by: CGFloat(M_PI_2))
    }

    if (img.imageOrientation == UIImageOrientation.right
        || img.imageOrientation == UIImageOrientation.rightMirrored) {

        transform = transform.translatedBy(x: 0, y: img.size.height);
        transform = transform.rotated(by: CGFloat(-M_PI_2));
    }

    if (img.imageOrientation == UIImageOrientation.upMirrored
        || img.imageOrientation == UIImageOrientation.downMirrored) {

        transform = transform.translatedBy(x: img.size.width, y: 0)
        transform = transform.scaledBy(x: -1, y: 1)
    }

    if (img.imageOrientation == UIImageOrientation.leftMirrored
        || img.imageOrientation == UIImageOrientation.rightMirrored) {

        transform = transform.translatedBy(x: img.size.height, y: 0);
        transform = transform.scaledBy(x: -1, y: 1);
    }


    // Now we draw the underlying CGImage into a new context, applying the transform
    // calculated above.
    let ctx:CGContext = CGContext(data: nil, width: Int(img.size.width), height: Int(img.size.height),
                                  bitsPerComponent: img.cgImage!.bitsPerComponent, bytesPerRow: 0,
                                  space: img.cgImage!.colorSpace!,
                                  bitmapInfo: img.cgImage!.bitmapInfo.rawValue)!

    ctx.concatenate(transform)


    if (img.imageOrientation == UIImageOrientation.left
        || img.imageOrientation == UIImageOrientation.leftMirrored
        || img.imageOrientation == UIImageOrientation.right
        || img.imageOrientation == UIImageOrientation.rightMirrored
        ) {


        ctx.draw(img.cgImage!, in: CGRect(x:0,y:0,width:img.size.height,height:img.size.width))

    } else {
        ctx.draw(img.cgImage!, in: CGRect(x:0,y:0,width:img.size.width,height:img.size.height))
    }


    // And now we just create a new UIImage from the drawing context
    let cgimg:CGImage = ctx.makeImage()!
    let imgEnd:UIImage = UIImage(cgImage: cgimg)

    return imgEnd
}

কয়েক সপ্তাহ ধরে এই সমস্যাটির সাথে লড়াই করার পরে এবং আরও বেশ কয়েকটি সমাধানের চেষ্টা করার পরে, এটি একদম নিখুঁতভাবে কাজ করে। আমি যদি +10 ভোট দিতে পারি তবে আমি দিতাম। ধন্যবাদ. :)
স্যারনড

@ মেটালহিয়ার্ট ২০০৩ এই পদ্ধতিটি আমার চিত্রের ফাইলের আকারকে বাড়িয়ে তোলে, আমার ২০০ কেবি থেকে ৪ এমবি চলে গেছে, এই ঘটনা বন্ধ করার কোনও উপায় আছে কি?
টিমউইটিং 11

2
@ টিমটিহিত মনে হচ্ছে আপনি একটি সংকুচিত চিত্র দিয়ে শুরু করছেন। তবে এই পদ্ধতিটি কোনও সংকোচনের ছাড়াই ঘোরানো চিত্র পুনরায় আঁকবে। আপনি বিআইএমএজেজেপিপিগ্রিপ্রেসিয়েশন ()
রিচার্ড

16

এর দ্রবণটির সুইচ 4.x / 5.0 সংস্করণ @an0:

extension UIImage {
    func upOrientationImage() -> UIImage? {
        switch imageOrientation {
        case .up:
            return self
        default:
            UIGraphicsBeginImageContextWithOptions(size, false, scale)
            draw(in: CGRect(origin: .zero, size: size))
            let result = UIGraphicsGetImageFromCurrentImageContext()
            UIGraphicsEndImageContext()
            return result
        }
    }
}

1
আপনাকে ধন্যবাদ। এটি নিখুঁতভাবে কাজ করে ost বেশিরভাগ আন্ডাররেটেড উত্তর।
বিনায়ক ভোর

@ বিনায়াকভোর:]
বেনিয়ামিন ওয়েইন

12

আমি এই পৃষ্ঠাটি আমার অ্যাপ্লিকেশন ডিজাইন করার সময় ব্যবহার করেছি যাতে ছবিগুলি লাগে এবং আমি দেখতে পেয়েছি যে নিম্নলিখিত পদ্ধতিটি পূর্বের উত্তরগুলির তুলনায় অরিয়েন্টেশনটি সংশোধন করবে এবং কম মেমরি এবং প্রসেসর ব্যবহার করবে:

CGImageRef cgRef = image.CGImage;
image = [[UIImage alloc] initWithCGImage:cgRef scale:1.0 orientation:UIImageOrientationUp];

এটি মূলত কেবল নতুন অভিযোজন সহ প্রকৃত চিত্রের ডেটা পুনরায় গুটিয়ে দেয়। আমি @ an0 এর কোডটি ব্যবহার করছিলাম তবে এটি মেমরিতে একটি নতুন চিত্র তৈরি করে যা একটি 3264x2448 চিত্রের উপর কর আদায় করতে পারে যা আপনি কোনও ক্যামেরা থেকে পেতে পারেন।


1
আমি এই উত্তরটি আইওএস 7.1 এর সাথে আইফোন 5 এস-তে পরীক্ষা করেছি তবে এটি কার্যকর হয়নি, যার মধ্যে উইন্ডোজ মেশিনগুলি [এমএস-পেইন্ট, উইন ফটো ভিউয়ার] এবং ইউআইআইমেজভিউ চিত্রটি মূল থেকে 90 ডিগ্রি অভিমুখীকরণের সাথে দেখিয়েছে! নোট করুন যে চিত্রগুলি ডিফল্ট ক্যামেরা টাচ বোতামের সাথে নিয়েছে, ভলিউম আপ নয়।
জাওয়াদ আল শায়খ

3
দেখে মনে হচ্ছে এটি কেবল ওরিয়েন্টেশন পতাকা
বদলেছে

10

আপনি যদি সম্পাদনা সক্ষম করে থাকেন তবে সম্পাদিত চিত্রটি (মূলটির বিপরীতে) প্রত্যাশার মতো হবে

UIImagePickerController *imagePickerController = [[UIImagePickerController alloc] init];
imagePickerController.allowsEditing = YES;
// set delegate and present controller

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info {
    UIImage *photo = [info valueForKey:UIImagePickerControllerEditedImage];
    // do whatever
}

সম্পাদনা সক্ষম করা ব্যবহারকারীকে "ফটো ব্যবহার করুন" আলতো চাপ দেওয়ার আগে চিত্রটিকে পুনরায় আকার দিতে এবং সরানোর অনুমতি দেয়


দুর্ভাগ্যক্রমে এই সমাধানটি চিত্রটিকে আনুভূমিকভাবে উল্টাতে পারে না, এমনকি সম্পাদনার অনুমতি দেয়।
কিং-উইজার্ড

4
কাজ করে তবে ব্যবহারকারীকে পরিবর্তনশীল ফসলের
মাপগুলিতে

6

ওরিয়েন্টেশন ইস্যু ঠিক করার জন্য এটি আমি খুঁজে পেয়েছি

UIImage *initialImage = [info objectForKey:@"UIImagePickerControllerOriginalImage"];
NSData *data = UIImagePNGRepresentation(self.initialImage);

UIImage *tempImage = [UIImage imageWithData:data];
UIImage *fixedOrientationImage = [UIImage imageWithCGImage:tempImage.CGImage
                                     scale:initialImage.scale
                               orientation:self.initialImage.imageOrientation];
initialImage = fixedOrientationImage;

সম্পাদনা করুন:

UIImage *initialImage = [info objectForKey:@"UIImagePickerControllerOriginalImage"];
NSData *data = UIImagePNGRepresentation(self.initialImage);

initialImage = [UIImage imageWithCGImage:[UIImage imageWithData:data].CGImage
                                                     scale:initialImage.scale
                                               orientation:self.initialImage.imageOrientation];

2
চিত্রটিকে পিএনজিতে ফিরিয়ে ফিরিয়ে চিত্রের মধ্যে খুব বেশি রূপান্তর, উপায়টিকে ব্যয়বহুল করে তুলেছে। @ an0 উত্তর আরও ভাল।
lxcid

4

Sourabh Sharmaকোড ক্লিন আপ সহ উত্তরের উত্তরের ভিত্তিতে সুইফট ৩.১-এর জন্য আপডেট ।

extension UIImage {
    func fixedOrientation() -> UIImage {
        if imageOrientation == .up { return self }

        var transform:CGAffineTransform = .identity
        switch imageOrientation {
        case .down, .downMirrored:
            transform = transform.translatedBy(x: size.width, y: size.height).rotated(by: .pi)
        case .left, .leftMirrored:
            transform = transform.translatedBy(x: size.width, y: 0).rotated(by: .pi/2)
        case .right, .rightMirrored:
            transform = transform.translatedBy(x: 0, y: size.height).rotated(by: -.pi/2)
        default: break
        }

        switch imageOrientation {
        case .upMirrored, .downMirrored:
            transform = transform.translatedBy(x: size.width, y: 0).scaledBy(x: -1, y: 1)
        case .leftMirrored, .rightMirrored:
            transform = transform.translatedBy(x: size.height, y: 0).scaledBy(x: -1, y: 1)
        default: break
        }

        let ctx = CGContext(data: nil, width: Int(size.width), height: Int(size.height),
                                       bitsPerComponent: cgImage!.bitsPerComponent, bytesPerRow: 0,
                                       space: cgImage!.colorSpace!, bitmapInfo: cgImage!.bitmapInfo.rawValue)!
        ctx.concatenate(transform)

        switch imageOrientation {
        case .left, .leftMirrored, .right, .rightMirrored:
            ctx.draw(cgImage!, in: CGRect(x: 0, y: 0, width: size.height,height: size.width))
        default:
            ctx.draw(cgImage!, in: CGRect(x: 0, y: 0, width: size.width,height: size.height))
        }
        return UIImage(cgImage: ctx.makeImage()!)
    }
}

চয়নকারী প্রতিনিধি পদ্ধতির উদাহরণ:

func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {
    guard let originalImage = info[UIImagePickerControllerOriginalImage] as? UIImage else { return }
    let fixedImage = originalImage.fixedOrientation()
    // do your work
}

4

এখানে এমন একটি সমাধান দেওয়া হয়েছে যা মূল চিত্রের রঙের স্থান পরিবর্তন করে না । আপনি যদি গ্রেস্কেল ইমেজের ওরিয়েন্টেশনকে স্বাভাবিক করতে চান তবে সমস্ত সমাধানের ভিত্তিতে আপনার ভাগ্যের বাইরে UIGraphicsBeginImageContextWithOptionsযেহেতু এটি আরজিবি কালারস্পেসে একটি প্রসঙ্গ তৈরি করে। পরিবর্তে, আপনাকে মূল চিত্রের মতো একই বৈশিষ্ট্যগুলির সাথে একটি প্রসঙ্গ তৈরি করতে হবে এবং আঁকতে হবে:

extension UIImage {
    static let rotatedOrentations: [UIImage.Orientation] = [.left, .leftMirrored, .right, .rightMirrored]

    func normalizedImage() -> UIImage {
        if imageOrientation == .up {
            return self
        }

        let image = self.cgImage!
        let swapOrientation = UIImage.rotatedOrentations.contains(imageOrientation)
        let width = swapOrientation ? image.height : image.width
        let height = swapOrientation ? image.width : image.height
        let context = CGContext(data: nil, width: width, height: height, bitsPerComponent: image.bitsPerComponent, bytesPerRow: image.bytesPerRow, space: image.colorSpace!, bitmapInfo: image.bitmapInfo.rawValue)!
        let flipVertical = CGAffineTransform(a: 1, b: 0, c: 0, d: -1, tx: 0, ty: CGFloat(height));
        context.concatenate(flipVertical)
        UIGraphicsPushContext(context)
        self.draw(at: .zero)
        UIGraphicsPopContext()

        return UIImage(cgImage: context.makeImage()!)
    }
}

3

দ্রুততার জন্য এখানে ইউআইআইমেজ এক্সটেনশান:

extension UIImage {

    func fixOrientation() -> UIImage {

        // No-op if the orientation is already correct
        if ( self.imageOrientation == UIImageOrientation.Up ) {
            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.
        var transform: CGAffineTransform = CGAffineTransformIdentity

        if ( self.imageOrientation == UIImageOrientation.Down || self.imageOrientation == UIImageOrientation.DownMirrored ) {
            transform = CGAffineTransformTranslate(transform, self.size.width, self.size.height)
            transform = CGAffineTransformRotate(transform, CGFloat(M_PI))
        }

        if ( self.imageOrientation == UIImageOrientation.Left || self.imageOrientation == UIImageOrientation.LeftMirrored ) {
            transform = CGAffineTransformTranslate(transform, self.size.width, 0)
            transform = CGAffineTransformRotate(transform, CGFloat(M_PI_2))
        }

        if ( self.imageOrientation == UIImageOrientation.Right || self.imageOrientation == UIImageOrientation.RightMirrored ) {
            transform = CGAffineTransformTranslate(transform, 0, self.size.height);
            transform = CGAffineTransformRotate(transform,  CGFloat(-M_PI_2));
        }

        if ( self.imageOrientation == UIImageOrientation.UpMirrored || self.imageOrientation == UIImageOrientation.DownMirrored ) {
            transform = CGAffineTransformTranslate(transform, self.size.width, 0)
            transform = CGAffineTransformScale(transform, -1, 1)
        }

        if ( self.imageOrientation == UIImageOrientation.LeftMirrored || self.imageOrientation == UIImageOrientation.RightMirrored ) {
            transform = CGAffineTransformTranslate(transform, self.size.height, 0);
            transform = CGAffineTransformScale(transform, -1, 1);
        }

        // Now we draw the underlying CGImage into a new context, applying the transform
        // calculated above.
        var ctx: CGContextRef = CGBitmapContextCreate(nil, Int(self.size.width), Int(self.size.height),
            CGImageGetBitsPerComponent(self.CGImage), 0,
            CGImageGetColorSpace(self.CGImage),
            CGImageGetBitmapInfo(self.CGImage));

        CGContextConcatCTM(ctx, transform)

        if ( self.imageOrientation == UIImageOrientation.Left ||
            self.imageOrientation == UIImageOrientation.LeftMirrored ||
            self.imageOrientation == UIImageOrientation.Right ||
            self.imageOrientation == UIImageOrientation.RightMirrored ) {
                CGContextDrawImage(ctx, CGRectMake(0,0,self.size.height,self.size.width), self.CGImage)
        } else {
            CGContextDrawImage(ctx, CGRectMake(0,0,self.size.width,self.size.height), self.CGImage)
        }

        // And now we just create a new UIImage from the drawing context and return it
        return UIImage(CGImage: CGBitmapContextCreateImage(ctx))!
    }
}

মেটালহার্ট ২০০৩ এর আগের কাজের উপর ভিত্তি করে ..


3

@ অ্যানোমি দ্বারা গৃহীত উত্তরের উপর ভিত্তি করে এখানে সুইফট 2-তে একটি ইউআইআইমেজ এক্সটেনশান রয়েছে। এটি একটি পরিষ্কার সুইচ কেস ব্যবহার করে। এটি CGBitmapContextCreateImage()বিবেচনা করে ফিরিয়ে দেওয়া alচ্ছিক মানও নেয় ।

extension UIImage {
    func rotateImageByOrientation() -> UIImage {
        // No-op if the orientation is already correct
        guard self.imageOrientation != .Up else {
            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.
        var transform = CGAffineTransformIdentity;

        switch (self.imageOrientation) {
        case .Down, .DownMirrored:
            transform = CGAffineTransformTranslate(transform, self.size.width, self.size.height)
            transform = CGAffineTransformRotate(transform, CGFloat(M_PI))

        case .Left, .LeftMirrored:
            transform = CGAffineTransformTranslate(transform, self.size.width, 0)
            transform = CGAffineTransformRotate(transform, CGFloat(M_PI_2))

        case .Right, .RightMirrored:
            transform = CGAffineTransformTranslate(transform, 0, self.size.height)
            transform = CGAffineTransformRotate(transform, CGFloat(-M_PI_2))

        default:
            break
        }

        switch (self.imageOrientation) {
        case .UpMirrored, .DownMirrored:
            transform = CGAffineTransformTranslate(transform, self.size.width, 0)
            transform = CGAffineTransformScale(transform, -1, 1)

        case .LeftMirrored, .RightMirrored:
            transform = CGAffineTransformTranslate(transform, self.size.height, 0)
            transform = CGAffineTransformScale(transform, -1, 1)

        default:
            break
        }

        // Now we draw the underlying CGImage into a new context, applying the transform
        // calculated above.
        let ctx = CGBitmapContextCreate(nil, Int(self.size.width), Int(self.size.height),
            CGImageGetBitsPerComponent(self.CGImage), 0,
            CGImageGetColorSpace(self.CGImage),
            CGImageGetBitmapInfo(self.CGImage).rawValue)
        CGContextConcatCTM(ctx, transform)
        switch (self.imageOrientation) {
        case .Left, .LeftMirrored, .Right, .RightMirrored:
            CGContextDrawImage(ctx, CGRectMake(0,0,self.size.height,self.size.width), self.CGImage)

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

        // And now we just create a new UIImage from the drawing context
        if let cgImage = CGBitmapContextCreateImage(ctx) {
            return UIImage(CGImage: cgImage)
        } else {
            return self
        }
    }
}

3

আমি এই সমস্যাটি ক্যামেরা থেকে তোলা ছবি বা ক্যামেরা রোলে সংরক্ষণ করা চিত্রগুলি যা ক্যামেরা থেকে নেওয়া হয়েছে তা নিয়ে অভিজ্ঞতা পেয়েছি। সাফারি ব্রাউজার থেকে ফটো লাইব্রেরিতে ডাউনলোড করা চিত্রগুলি আপলোড করার সময় ঘোরবে না।

আপলোড করার আগে আমি ইমেজ ডেটা জেপিইজি হিসাবে তৈরি করে এই সমস্যাটি সমাধান করতে সক্ষম হয়েছি।

let image = info[UIImagePickerControllerOriginalImage] as! UIImage        
let data = UIImageJPEGRepresentation(image, 1.0)

আমরা এখন আপলোডের জন্য ডেটা ব্যবহার করতে পারি এবং আপলোডের পরে চিত্রটি ঘোরানো হবে না।

আশা করি এটি কার্যকর হবে।


এত আশ্চর্যের বিষয় যে পিএনজি ডেটা ঘোরানো থাকে, তবে জেপিইগ ডেটা ব্যবহার করার সময় ঘূর্ণনটি স্থির হয়ে যায়।
user3344977

2

আমি কোডের কয়েকটি লাইনের নিচে লিখে এটি অর্জন করেছি

extension UIImage {

    public func correctlyOrientedImage() -> UIImage {
        if self.imageOrientation == UIImage.Orientation.up {
            return self
        }

        UIGraphicsBeginImageContextWithOptions(self.size, false, self.scale)
        self.draw(in: CGRect(x: 0, y: 0, width: self.size.width, height: self.size.height))
        let normalizedImage:UIImage = UIGraphicsGetImageFromCurrentImageContext()!;
        UIGraphicsEndImageContext();

        return normalizedImage;
    }
}

0

যদি আমি বুঝতে পারি, আপনি যা করতে চান তা কি ইউআইআইএমেজ অবলম্বনকে উপেক্ষা করবেন? যদি তা হয় তবে আপনি এটি করতে পারতেন: -

//image is your original image
image = [UIImage imageWithCGImage:[image CGImage]
                             scale:[image scale]
                       orientation: UIImageOrientationUp];

বা সুইফটে: -

image = UIImage(CGImage: image.CGImage!, scale: image.scale, orientation:.Up)

এটি আমার ফসলের সমস্যা সমাধান করেছে .. আশা করি, আপনি যা খুঁজছেন এটিই ..


0

@ জেক ১৯৮১ এর উপর ভিত্তি করে সুইফ্ট 3 সংস্করণ যারা @ মেটালহিয়ার্ট ২০০৩ থেকে এনেছেন

extension UIImage {

    func fixOrientation() -> UIImage {

        // No-op if the orientation is already correct
        if ( self.imageOrientation == UIImageOrientation.up ) {
            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.

        var transform: CGAffineTransform = CGAffineTransform.identity

        if ( self.imageOrientation == UIImageOrientation.down || self.imageOrientation == UIImageOrientation.downMirrored ) {
            transform = transform.translatedBy(x: self.size.width, y: self.size.height)
            transform = transform.rotated(by: CGFloat(M_PI))
        }

        if ( self.imageOrientation == UIImageOrientation.left || self.imageOrientation == UIImageOrientation.leftMirrored ) {
            transform = transform.translatedBy(x: self.size.width, y: 0)
            transform = transform.rotated(by: CGFloat(M_PI_2))
        }

        if ( self.imageOrientation == UIImageOrientation.right || self.imageOrientation == UIImageOrientation.rightMirrored ) {
            transform = transform.translatedBy(x: 0, y: self.size.height);
            transform = transform.rotated(by: CGFloat(-M_PI_2));
        }

        if ( self.imageOrientation == UIImageOrientation.upMirrored || self.imageOrientation == UIImageOrientation.downMirrored ) {
            transform = transform.translatedBy(x: self.size.width, y: 0)
            transform = transform.scaledBy(x: -1, y: 1)
        }

        if ( self.imageOrientation == UIImageOrientation.leftMirrored || self.imageOrientation == UIImageOrientation.rightMirrored ) {
            transform = transform.translatedBy(x: self.size.height, y: 0);
            transform = transform.scaledBy(x: -1, y: 1);
        }

        // Now we draw the underlying CGImage into a new context, applying the transform
        // calculated above.
        let ctx: CGContext = CGContext(data: nil, width: Int(self.size.width), height: Int(self.size.height),
                                       bitsPerComponent: self.cgImage!.bitsPerComponent, bytesPerRow: 0,
                                       space: self.cgImage!.colorSpace!,
                                       bitmapInfo: self.cgImage!.bitmapInfo.rawValue)!
        ctx.concatenate(transform)

        if ( self.imageOrientation == UIImageOrientation.left ||
            self.imageOrientation == UIImageOrientation.leftMirrored ||
            self.imageOrientation == UIImageOrientation.right ||
            self.imageOrientation == UIImageOrientation.rightMirrored ) {

            ctx.draw(self.cgImage!, in: CGRect(x: 0, y: 0, width: self.size.height, height: self.size.width))
        } else {
            ctx.draw(self.cgImage!, in: CGRect(x: 0, y: 0, width: self.size.width, height: self.size.height))
        }

        // And now we just create a new UIImage from the drawing context and return it
        return UIImage(cgImage: ctx.makeImage()!)

    }
}

0
@an0, thanks for the answer!
The only thing is autoreleasepool: 

func fixOrientation(img: UIImage) -> UIImage? {

    let result: UIImage?
    if img.imageOrientation == .up {
        result = img
    } else {

        result = autoreleasepool { () -> UIImage? in
            UIGraphicsBeginImageContextWithOptions(img.size, false, img.scale)
            let rect = CGRect(x: 0, y: 0, width: img.size.width, height: img.size.height)
            img.draw(in: rect)

            let normalizedImage = UIGraphicsGetImageFromCurrentImageContext()
            UIGraphicsEndImageContext()

            return normalizedImage
        }
    }

    return result
}

0

আপনার ইমেজ ওরিয়েন্টেশন রিটার্নস ইউআইআইমেজকে স্বয়ংক্রিয়ভাবে ঠিক করার জন্য এখানে সুইফট -৪.২ কোড রয়েছে

func AutofixImageOrientation(_ image: UIImage)->UIImage {

    UIGraphicsBeginImageContext(image.size)

    image.draw(at: .zero)

    let newImage = UIGraphicsGetImageFromCurrentImageContext()

    UIGraphicsEndImageContext()

    return newImage ?? image
}

0

আমি এটি জামারিনে স্থানান্তরিত করেছি:

private static UIImage FixImageOrientation(UIImage image)
    {
        if (image.Orientation == UIImageOrientation.Up)
        {
            return image;
        }

        var transform = CGAffineTransform.MakeIdentity();

        float pi = (float)Math.PI;

        switch (image.Orientation)
        {
            case UIImageOrientation.Down:
            case UIImageOrientation.DownMirrored:
                transform = CGAffineTransform.Translate(transform, image.Size.Width, image.Size.Height);
                transform = CGAffineTransform.Rotate(transform, pi);
                break;

            case UIImageOrientation.Left:
            case UIImageOrientation.LeftMirrored:
                transform = CGAffineTransform.Translate(transform, image.Size.Width, 0);
                transform = CGAffineTransform.Rotate(transform, pi / 2);
                break;

            case UIImageOrientation.Right:
            case UIImageOrientation.RightMirrored:
                transform = CGAffineTransform.Translate(transform, 0, image.Size.Height);
                transform = CGAffineTransform.Rotate(transform, -(pi / 2));
                break;
        }

        switch (image.Orientation)
        {
            case UIImageOrientation.UpMirrored:
            case UIImageOrientation.DownMirrored:
                transform = CGAffineTransform.Translate(transform, image.Size.Width, 0);
                transform = CGAffineTransform.Scale(transform, -1, 1);
                break;

            case UIImageOrientation.LeftMirrored:
            case UIImageOrientation.RightMirrored:
                transform = CGAffineTransform.Translate(transform, image.Size.Height, 0);
                transform = CGAffineTransform.Scale(transform, -1, 1);
                break;
        }

        var ctx = new CGBitmapContext(null, (nint)image.Size.Width, (nint)image.Size.Height, image.CGImage.BitsPerComponent,
            image.CGImage.BytesPerRow, image.CGImage.ColorSpace, image.CGImage.BitmapInfo);

        ctx.ConcatCTM(transform);

        switch (image.Orientation)
        {
            case UIImageOrientation.Left:
            case UIImageOrientation.LeftMirrored:
            case UIImageOrientation.Right:
            case UIImageOrientation.RightMirrored:
                ctx.DrawImage(new CGRect(0, 0, image.Size.Height, image.Size.Width), image.CGImage);
                break;

            default:
                ctx.DrawImage(new CGRect(0, 0, image.Size.Width, image.Size.Height), image.CGImage);
                break;
        }

        var cgimg = ctx.ToImage();
        var img = new UIImage(cgimg);

        ctx.Dispose();
        ctx = null;
        cgimg.Dispose();
        cgimg = null;

        return img;
    }
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.