অনুভূমিকভাবে ইউআইআইমেজ কীভাবে ফ্লিপ করবেন?


111

UIImageঅনুভূমিকভাবে কীভাবে উল্টাতে হবে , শ্রেণীর রেফারেন্সে আমি UIImageOrientationUpMirroredগণনা মানটি পেয়েছি UIImage, কীভাবে এই সম্পত্তিটি ফ্লিপ করতে ব্যবহার করব UIImage


আরথের সূক্ষ্ম উত্তরে যুক্ত করতে অ্যাপল এই লিঙ্কটিতে
কোকো

গৃহীতরা আমার পক্ষে কাজ করছে না বলে আমি এই বিভাগটি পেয়েছি । একটি যাদুমন্ত্র মত কাজ করে.
dwbrito

উত্তর:


237

উদ্দেশ্য গ

UIImage* sourceImage = [UIImage imageNamed:@"whatever.png"];

UIImage* flippedImage = [UIImage imageWithCGImage:sourceImage.CGImage 
                                            scale:sourceImage.scale
                                      orientation:UIImageOrientationUpMirrored];

দ্রুতগতি

let flippedImage = myImage.withHorizontallyFlippedOrientation()

14
এই উত্তরের সাথে দুটি সমস্যা রয়েছে - রেটিনা প্রতিযোগিতামূলক চিত্রগুলিতে স্কেল 1.0 নয় এবং কোনও কারণে ফ্লিপ না করার UIImageOrientationUpসময় কাজ UIImageOrientationUpMirroredকরেছে। এটি কাজ করেছে -image = [UIImage imageWithCGImage:image.CGImage scale:image.scale orientation:UIImageOrientationUp]
কোফ

1
@ কফ হিসাবে আমি লক্ষ্য করেছি, আপনি যে ওরিয়েন্টেশন প্যারামিটারটি পাস করেছেন সেটি 'সোর্সআইমেজ এর ওরিয়েন্টেশনটি ইতিমধ্যে কি' তা নির্ধারণ করতে ব্যবহৃত হয়েছে 'নির্দিষ্ট চিত্রের সাথে এই চিত্রটি আমাকে দেওয়ার' এর বিপরীতে। অতএব, আপনি সোর্স ইমেজ.আইমেজ ওরিয়েন্টেশন প্যারামিটারটি পরিদর্শন করতে পারেন এবং কী চান তা দেওয়ার জন্য পদ্ধতিটি চালিত করতে একটি ভিন্ন অভিযোজনে পাস করতে পারেন
Ege Akpinar

6
sourceImage.scaleস্কেলের জন্য ব্যবহার করা ভাল ।
স্যাম সোফেস

কীভাবে সুইফটে এটি করবেন? [ইউআইআইমেজ চিত্রের সাথে সিজিআইমেজ ...] সেখানে উপলভ্য নয়।
লিম থিয়ে চেন

3
আমি যখন চেষ্টা করার চেষ্টা করি তখন এটি পুরোপুরি ভেঙে যায় [flippedImage imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate]। কোন ধারণা কেন?
ডিভাইস 1

70

আপনি এটি অর্জন করার একটি খুব সহজ উপায় হ'ল একটি ইউআইআইমেজটির পরিবর্তে একটি ইউআইআইমেজভিউ তৈরি করা এবং ইউআইআইমেজভিউতে রূপান্তর করা।

yourImageView.image =[UIImage imageNamed:@"whatever.png"];
yourImageView.transform = CGAffineTransform(scaleX: -1, y: 1); //Flipped

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


2
এটি UIImageম্যানিপুলেশনের চেয়ে আমার পক্ষে আরও ভাল কাজ করে , যা UIImageRenderingModeAlwaysTemplateরেন্ডারিং মোডের সাথে মিলিত হওয়ার সাথে সাথে আমার পার্শ্ব প্রতিক্রিয়া হয়েছিল ।
ডিভাইস

2
এই ভাগ করার জন্য আপনাকে ধন্যবাদ। এই পোস্টের সাথে যুক্ত এই ধাঁধাটির "উত্তর" দিয়ে আমার ভাগ্য নেই, তবে আপনার উত্তরটি দুর্দান্তভাবে কাজ করেছে এবং কোডের কেবল 1 লাইন ছিল।
অ্যাড্রিয়ান

দুর্দান্ত কাজ! আইওএস 9+ এ এখন ফ্লিপসফোরাইটটেলফিটলআউটডাইরেশনও অন্তর্ভুক্ত রয়েছে তবে এটি আইওএস 8+ অ্যাপ্লিকেশনগুলির জন্য এখনও কাজ করবে না।

3
আপনি যদি yourImageView.transform = CGAffineTransformIdentity
ফ্লিপিংটি

এই পদ্ধতিটি ইউআইআইমেজভিউতে 'রূপান্তর' নোট করুন। এটি প্রকৃত ইউআইআইমেজকে ফ্লিপ করে না।
ধীরে ধীরে

36

উল্লম্ব ফ্লিপ প্রায়শই ব্যবহার করে ওপেনএল টেক্সচার শুরু করার প্রয়োজন হয় glTexImage2d(...)। উপরের প্রস্তাবিত কৌশলগুলি চিত্রের ডেটা পরিবর্তন করে না এবং এই ক্ষেত্রে কার্যকর হবে না। Https://stackoverflow.com/a/17909372 দ্বারা অনুপ্রাণিত প্রকৃত ডেটা ফ্লিপ করার জন্য এখানে একটি কোড

- (UIImage *)flipImage:(UIImage *)image
{
    UIGraphicsBeginImageContext(image.size);
    CGContextDrawImage(UIGraphicsGetCurrentContext(),CGRectMake(0.,0., image.size.width, image.size.height),image.CGImage);
    UIImage *i = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return i;
}

1
কিভাবে এই ফ্লিপ ইমেজ? দেখে মনে হচ্ছে এটি আবার ছবি আঁকবে।
জোনাথন

@Jonathan। আমি মনে করি এটি অঙ্কন করার সময় বিভিন্ন স্থানাঙ্ক ব্যবস্থার (অর্থাত্ Y অক্ষের দিকের) কারণে ফ্লপ হয় fl
আলেক্সি পোদলাসভ

চিত্রটি উল্লম্বভাবে উল্টাতে কি এটি ব্যবহার করার কোনও উপায় আছে?
প্রেক্সাইটেলস

এই পদ্ধতিটি ইমেজ রেন্ডারিংকেও দুর্দান্তভাবে সমর্থন করে - সর্বদা টেমপ্লেট
পিটার স্ট্যাজার

3
মানের সমস্যা সমাধানের জন্য, ইউআইজিগ্রাফিকসবেগিনআইমেজকন্টেক্সটভিথঅথশনস (চিত্র.সাইজ, কোনও, চিত্র.স্কেল) ব্যবহার করুন; পরিবর্তে.
নিক লকউড

14

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

let ciimage: CIImage = CIImage(CGImage: imagenInicial.CGImage!)
let rotada3 = ciimage.imageByApplyingTransform(CGAffineTransformMakeScale(-1, 1))

আপনি আমার খেলার মাঠে দেখতে পারেন এটি কাজ করে !! :) এখানে চিত্র বর্ণনা লিখুন

এবং অবশ্যই, চূড়ান্তআইমেজ = ইউআইআইমেজ (সিআইআইমেজ: রটাডা 3) আসুন


দুঃখিত, তবে এটি আর কাজ না করার মতো দেখায়, কমপক্ষে ক্যামেরা তোলা ছবি সহ ...
Oni_01

12

ইমেজ ওরিয়েন্টেশন যেমন সংজ্ঞায়িত করে:

typedef NS_ENUM(NSInteger, UIImageOrientation) {
UIImageOrientationUp,            // default orientation
UIImageOrientationDown,          // 180 deg rotation
UIImageOrientationLeft,          // 90 deg CCW
UIImageOrientationRight,         // 90 deg CW
UIImageOrientationUpMirrored,    // as above but image mirrored along other axis. horizontal flip
UIImageOrientationDownMirrored,  // horizontal flip
UIImageOrientationLeftMirrored,  // vertical flip
UIImageOrientationRightMirrored, // vertical flip
};

আমি অ্যাভিক্যাপচারসেশন থেকে ইউআইআইমেজ পরিচালনা করার মতো আরও পরিস্থিতির জন্য কিছু উন্নতি করেছি।

UIImage* sourceImage = [UIImage imageNamed:@"whatever.png"];
UIImageOrientation flipingOrientation;
if(sourceImage.imageOrientation>=4){
    flippedOrientation = sourceImage.imageOrientation - 4;
}else{
    flippedOrientation = sourceImage.imageOrientation + 4;
}
UIImage* flippedImage = [UIImage imageWithCGImage:sourceImage.CGImage 
                     scale: sourceImage.scale orientation: flipingOrientation];

9

এখানে দ্রুততম সংস্করণ: (আমি মন্তব্যটিতে এই প্রশ্নটি দেখেছি)

let srcImage = UIImage(named: "imageName")
let flippedImage = UIImage(CGImage: srcImage.CGImage, scale: srcImage.scale, orientation: UIImageOrientation.UpMirrored)


7

অনুভূমিকভাবে একটি UIImage আয়না / ফ্লিপ করার জন্য এটি একটি দৃ implementation় বাস্তবায়ন এবং এটি চিত্রের পিছনে পিছনে প্রয়োগ করতে পারে। যেহেতু এটি অন্তর্নিহিত চিত্রের ডেটা পরিবর্তন করে, অঙ্কন (যেমন, স্ক্রিনশট) এছাড়াও পরিবর্তন হবে। কাজ করার জন্য পরীক্ষিত, কোনও মানের ক্ষতি হয় না।

func flipImage() -> UIImage? {
        UIGraphicsBeginImageContextWithOptions(self.size, false, self.scale)
        let bitmap = UIGraphicsGetCurrentContext()!

        bitmap.translateBy(x: size.width / 2, y: size.height / 2)
        bitmap.scaleBy(x: -1.0, y: -1.0)

        bitmap.translateBy(x: -size.width / 2, y: -size.height / 2)
        bitmap.draw(self.cgImage!, in: CGRect(x: 0, y: 0, width: size.width, height: size.height))

        let image = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()

        return image?
}

5

এটি কারওর জন্য ব্যবহারযোগ্য হবে:

    UIImageOrientation imageOrientation;

    switch (sourceImage.imageOrientation) {
        case UIImageOrientationDown:
            imageOrientation = UIImageOrientationDownMirrored;
            break;

        case UIImageOrientationDownMirrored:
            imageOrientation = UIImageOrientationDown;
            break;

        case UIImageOrientationLeft:
            imageOrientation = UIImageOrientationLeftMirrored;
            break;

        case UIImageOrientationLeftMirrored:
            imageOrientation = UIImageOrientationLeft;

            break;

        case UIImageOrientationRight:
            imageOrientation = UIImageOrientationRightMirrored;

            break;

        case UIImageOrientationRightMirrored:
            imageOrientation = UIImageOrientationRight;

            break;

        case UIImageOrientationUp:
            imageOrientation = UIImageOrientationUpMirrored;
            break;

        case UIImageOrientationUpMirrored:
            imageOrientation = UIImageOrientationUp;
            break;
        default:
            break;
    }

    resultImage = [UIImage imageWithCGImage:sourceImage.CGImage scale:sourceImage.scale orientation:imageOrientation];


2

একটি সাধারণ এক্সটেনশন।

extension UIImage {

    var flipped: UIImage {
        guard let cgImage = cgImage else {
            return self
        }

        return UIImage(cgImage: cgImage, scale: scale, orientation: .upMirrored)
    }
}

ব্যবহার:

let image = #imageLiteral(resourceName: "imageName")
let imageView = UIImageView(image: image.flipped)

এক্সটেনশনগুলি সুইফটের অন্যতম সেরা বৈশিষ্ট্য। আমি আশ্চর্য হয়েছি যে উপরের মূল উত্তরগুলি এটি সুপারিশ করতে ব্যর্থ হয়েছে I আমি এই সংস্করণটি আরও ভাল পছন্দ করি
ডিএস।

1

এটি একটি কার্যকারী iOS8 / 9 সামঞ্জস্যপূর্ণ সংস্করণ:

UIImage *image = [UIImage imageNamed:name];

if ([[UIApplication sharedApplication] userInterfaceLayoutDirection] == UIUserInterfaceLayoutDirectionRightToLeft) {

    if ([image respondsToSelector:@selector(imageFlippedForRightToLeftLayoutDirection)]) {
        //iOS9
        image = image.imageFlippedForRightToLeftLayoutDirection;
    }
    else {
        //iOS8
        CIImage *coreImage = [CIImage imageWithCGImage:image.CGImage];
        coreImage = [coreImage imageByApplyingTransform:CGAffineTransformMakeScale(-1, 1)];
        image = [UIImage imageWithCIImage:coreImage scale:image.scale orientation:UIImageOrientationUp];
    }
}

return image;

আমি মনে করি না এটি সেরা ধারণা। এটি imageFlippedForRightToLeftLayoutDirection ফ্লিপযুক্ত বিন্যাসের দিকনির্দেশের সাহায্যে ব্যবহৃত হয় - উদাহরণস্বরূপ আরব দেশগুলির জন্য। সুতরাং এটি ব্যবহার করা সর্বদা পছন্দসই হিসাবে কাজ করবে না।
পিটার স্ট্যাজার

1
হ্যাঁ, আপনি সঠিক - আমার ক্ষেত্রে এটি ঠিক আরটিএল সমর্থনের জন্য ছিল। আমরা সকলেই জানি যে SO- র কোডটি রেফারেন্সের জন্য এবং লোকেদের সত্যিই কেবল প্রথমে না বুঝে কেবল অনুলিপি / পেস্ট করে না, তাই না?
ক্যাপিকা ওয়া

1

উপরের সুইফ্ট 3 এবং তার উপর পরীক্ষিত

এক্সটেনশন সহ এই সমস্যাটি অর্জনের সহজ সমাধান এখানে। আমি এটি পরীক্ষা করি এবং এটি কাজ করে। আপনি যে কোনও দিকে আয়না করতে পারেন।

extension UIImage {

    func imageUpMirror() -> UIImage {
        guard let cgImage = cgImage else { return self }
        return UIImage(cgImage: cgImage, scale: scale, orientation: .upMirrored)
    }

    func imageDownMirror() -> UIImage {
        guard let cgImage = cgImage else { return self }
        return UIImage(cgImage: cgImage, scale: scale, orientation: .downMirrored)
    }

    func imageLeftMirror() -> UIImage {
        guard let cgImage = cgImage else { return self }
        return UIImage(cgImage: cgImage, scale: scale, orientation: .leftMirrored)
    }

    func imageRightMirror() -> UIImage {
        guard let cgImage = cgImage else { return self }
        return UIImage(cgImage: cgImage, scale: scale, orientation: .rightMirrored)
    }
}

এই কোডের জন্য ব্যবহার

let image = #imageLiteral(resourceName: "imageName")
flipHorizontally = image.imageUpMirror()

সুতরাং, আপনি অন্যান্য ফাংশন ব্যবহার করতে পারেন।


0

উপরে পরিবর্তিত এবং সুইফট 3- এ দেওয়া উত্তরগুলির মধ্যে একটি এখানে আমি বিশেষভাবে কার্যকর পেয়েছি যখন আপনার কাছে একটি বোতাম রয়েছে যা ইমেজটি পিছনে পিছনে ফ্লিপ করতে হবে।

func flipImage(sourceImage: UIImage,orientation: UIImageOrientation) -> UIImage {


        var imageOrientation = orientation

        switch sourceImage.imageOrientation {

        case UIImageOrientation.down:
            imageOrientation = UIImageOrientation.downMirrored;
            break;

        case UIImageOrientation.downMirrored:
            imageOrientation = UIImageOrientation.down;
            break;

        case UIImageOrientation.left:
            imageOrientation = UIImageOrientation.leftMirrored;
            break;

        case UIImageOrientation.leftMirrored:
            imageOrientation = UIImageOrientation.left;

            break;

        case UIImageOrientation.right:
            imageOrientation = UIImageOrientation.rightMirrored;

            break;

        case UIImageOrientation.rightMirrored:
            imageOrientation = UIImageOrientation.right;

            break;

        case UIImageOrientation.up:
            imageOrientation = UIImageOrientation.upMirrored;
            break;

        case UIImageOrientation.upMirrored:
            imageOrientation = UIImageOrientation.up;
            break;


        }


        return UIImage(cgImage: sourceImage.cgImage!, scale: sourceImage.scale, orientation: imageOrientation)

    }

ব্যবহার করুন:

imageToFlip: UIImage = flipImage(sourceImage: imageToFlip, orientation: imageToFlip.imageOrientation)

0

সুইট 3 এ আরথের উত্তর :

let sourceImage = UIImage(named: "whatever.png")!
let flippedImage = UIImage(cgImage: sourceImage.cgImage!, scale: sourceImage.scale, orientation: .upMirrored)

0

সুইফট 4

yourImage.transform = CGAffineTransform(scaleX: -1, y: 1)

3
কোড-কেবল উত্তরগুলি সাধারণত নিম্ন-মানের হিসাবে বিবেচিত হয়। আপনার কোড ছাড়াও, এটি কীভাবে / কেন কাজ করে, সমস্যার সমাধান করে বা প্রশ্নের উত্তর দেয় তা ব্যাখ্যা করুন।
ছারভে

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

এছাড়াও, আপনি কেবল আমার উত্তরটি অনুলিপি করেছেন এবং দ্রুত 4 লিখেছেন
সেকড সায়াগ

0

আন-র্যাপিংয়ের কারণে নিম্নলিখিতটি করুন:

let srcImage = UIImage(named: "myimage")!
let flippedImage = UIImage(cgImage: srcImage.cgImage!, 
                   scale: srcImage.scale, orientation: UIImage.Orientation.upMirrored)

0

আপনি এটি ব্যবহার করতে চাইলে চিত্রটি ঘোরান

সুইফট 4

extension UIImage {
public func imageRotatedByDegrees(degrees: CGFloat, flip: Bool) -> UIImage {
    let radiansToDegrees: (CGFloat) -> CGFloat = {
        return $0 * (180.0 / CGFloat(M_PI))
    }
    let degreesToRadians: (CGFloat) -> CGFloat = {
        return $0 / 180.0 * CGFloat(M_PI)
    }

    // calculate the size of the rotated view's containing box for our drawing space
    let rotatedViewBox = UIView(frame: CGRect(origin: CGPoint.zero, size: size))
    let t = CGAffineTransform(rotationAngle: degreesToRadians(degrees));
    rotatedViewBox.transform = t
    let rotatedSize = rotatedViewBox.frame.size

    // Create the bitmap context
    UIGraphicsBeginImageContext(rotatedSize)
    let bitmap = UIGraphicsGetCurrentContext()!

    bitmap.translateBy(x: rotatedSize.width / 2.0, y: rotatedSize.height / 2.0)
    // Move the origin to the middle of the image so we will rotate and scale around the center.
    //CGContextTranslateCTM(bitmap, rotatedSize.width / 2.0, rotatedSize.height / 2.0);

    //   // Rotate the image context
    bitmap.rotate(by: degreesToRadians(degrees))
   // CGContextRotateCTM(bitmap, degreesToRadians(degrees));

    // Now, draw the rotated/scaled image into the context
    var yFlip: CGFloat

    if(flip){
        yFlip = CGFloat(-1.0)
    } else {
        yFlip = CGFloat(1.0)
    }
    bitmap.scaleBy(x: yFlip, y: -1.0)
    //CGContextScaleCTM(bitmap, yFlip, -1.0)
    bitmap.draw(self.cgImage!, in: CGRect.init(x: -size.width / 2, y: -size.height / 2, width: size.width, height: size.height))
   // CGContextDrawImage(bitmap, CGRectMake(-size.width / 2, -size.height / 2, size.width, size.height), CGImage)

    let newImage = UIGraphicsGetImageFromCurrentImageContext()!
    UIGraphicsEndImageContext()

    return newImage
}

}


0

সুইফ্ট 5 - এক্সকোড 11.5

অনুভূমিকভাবে ঘোরার জন্য সেরা সমাধান: এই ভিডিওটি দেখুন:

https://m.youtube.com/watch?v=4kSLbuB-MlU

অথবা এই কোডটি ব্যবহার করুন:

    
import UIKit
class FirstViewControl: UIViewController {
    @IBOutlet weak var buttonAnim: UIButton!

    @IBAction func ClickOnButtonAnim(_ sender: UIButton) {    
        UIView.transition(with: buttonAnim, duration: 0.4, options: .transitionFlipFromLeft, animation: nil , completion: nil)
    }

}

আপনি এই অ্যানিমেশনটিতে যে কোনও ইউআই (বোতাম বা লেবেল বা ইউভিউ বা চিত্র) ব্যবহার করতে পারেন।


1
উত্তর হিসাবে লিঙ্ক পোস্ট করার পরামর্শ দেওয়া হয় না। লিঙ্কটি কোনও দিন অবৈধ হতে পারে। যদি আপনি বিশ্বাস করেন যে পদ্ধতিটি সহায়ক, তবে আপনি কি এখানে এটি পোস্ট করতে পারেন?
ক্রিস্টোফার
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.