সিজি কনটেক্সটড্রাজাইমেজ ইউআইআইমেজ.সিজিআইমেজ পাস করার সময় চিত্রটি উল্টো করে আঁকবে


179

কেউ কি জানেন যে CGContextDrawImageআমার চিত্রটি উল্টোভাবে আঁকবে কেন ? আমি আমার অ্যাপ্লিকেশন থেকে একটি চিত্র লোড করছি:

UIImage *image = [UIImage imageNamed:@"testImage.png"];

এবং তারপরে কেবল কোর গ্রাফিক্সকে এটি আমার প্রসঙ্গে আঁকতে বলুন:

CGContextDrawImage(context, CGRectMake(0, 0, 145, 15), image.CGImage);

এটি সঠিক জায়গায় এবং মাত্রাতে রেন্ডার করে তবে চিত্রটি উল্টো দিকে। আমি এখানে সত্যিই সুস্পষ্ট কিছু মিস করছি?

উত্তর:


238

পরিবর্তে

CGContextDrawImage(context, CGRectMake(0, 0, 145, 15), image.CGImage);

ব্যবহার

[image drawInRect:CGRectMake(0, 0, 145, 15)];

আপনার শুরু / শেষ CGcontextপদ্ধতির মাঝখানে ।

এটি আপনার বর্তমান চিত্রের প্রসঙ্গে সঠিক ওরিয়েন্টেশন সহ চিত্রটি আঁকবে - আমি দৃ this়ভাবে নিশ্চিত যে এটিকে UIImageওরিয়েন্টেশনের জ্ঞান ধরে রাখার সাথে কিছু করার আছে যদিও CGContextDrawImageপদ্ধতিটি অরিয়েন্টেশনের কোনও বোঝা ছাড়াই অন্তর্নিহিত কাঁচা চিত্রের ডেটা পাবে।


19
এই সমাধানটি আপনাকে আপনার চিত্রের সিজি ফাংশনগুলি যেমন সিজি কনটেক্সটসেটআল্ফা () ব্যবহার করার অনুমতি দেয় না, যেখানে দ্বিতীয় উত্তরটি দেয় answer
সামভারমেট

2
ভাল কথা, যদিও বেশিরভাগ ক্ষেত্রে আপনার ছবি আঁকার জন্য কাস্টম আলফা স্তরের প্রয়োজন হয় না (সাধারণত যা আলফার জন্য প্রয়োজনীয় জিনিসগুলির জন্য সময়ের আগে চিত্রগুলিতে বেকড থাকে)। মূলত আমার মূলমন্ত্রটি হল, একটি সামান্য কোডটি আপনি পারেন হিসাবে ব্যবহার করুন কারণ আরও কোড মানে বাগের জন্য আরও বেশি সম্ভাবনা।
কেন্ডল হেলস্টেটার জেলনার 21'10

হাই, আপনার প্রারম্ভিক / শেষ সিজি কনটেক্সট পদ্ধতির মাঝখানে আপনি কী বোঝাতে চেয়েছেন, আপনি আমাকে আরও নমুনা কোড দিতে পারেন? আমি কোথাও প্রসঙ্গটি সংরক্ষণ করার চেষ্টা করছি এবং প্রেক্ষাপটটি ছবি আঁকতে ব্যবহার করতে চাই
ভদখং

2
যদিও এটি মরিচা জন্য কাজ করতে পারে, - [[আইআইআইএমেজ অঙ্কনআইরেক্ট:] এর সমস্যা আছে যে এটি থ্রেড-নিরাপদ নয়। আমার বিশেষ অ্যাপ্লিকেশনটির জন্য, এজন্য আমি প্রথম স্থানটিতে সিজি কনটেক্সটড্রাইজ্যামেজ () ব্যবহার করছি।
অলি

2
কেবল স্পষ্ট করে বলার জন্য: কোর গ্রাফিকগুলি ওএস এক্সে তৈরি করা হয়েছে যেখানে আইওএসের তুলনায় স্থানাঙ্ক সিস্টেমটি উল্টে রয়েছে (ওএস এক্সের নীচে বাম দিকে শুরু করা y)। এজন্য কোর গ্রাফিক্স চিত্রটি উল্টোদিকে আঁকছে যেখানে অঙ্কনরেট আপনার পক্ষে এটি পরিচালনা করে
বোরচোরো

213

আমি উল্লিখিত সমস্ত কিছু প্রয়োগ করার পরেও ছবিগুলির সাথে আমার নাটক ছিল। শেষ পর্যন্ত, আমি আমার সমস্ত চিত্রের একটি 'উল্টানো উল্লম্ব' সংস্করণ তৈরি করতে স্রেফ জিম ব্যবহার করেছি। এখন আমার কোনও ট্রান্সফর্ম ব্যবহার করার দরকার নেই। আশা করি এর ফলে ট্র্যাকটি আরও সমস্যার সৃষ্টি করবে না।

কেউ কি জানেন যে কেন সিজি কনটেক্সটড্রাউইমেজ আমার চিত্রটি উল্টো করে আঁকবে? আমি আমার অ্যাপ্লিকেশন থেকে একটি চিত্র লোড করছি:

কোয়ার্টজ 2 ডি একটি ভিন্ন সমবায় সিস্টেম ব্যবহার করে, যেখানে উত্সটি নীচের বাম কোণে। সুতরাং কোয়ার্টজ যখন 100 * 100 চিত্রের পিক্সেল x [5], y [10] আঁকেন, তখন সেই পিক্সেলটি উপরের বামের পরিবর্তে নীচের বাম কোণে আঁকানো হচ্ছে। সুতরাং 'উল্টানো' ইমেজ কারণ।

এক্স কো-অর্ডিনেট সিস্টেমের সাথে মেলে, তাই আপনার y- সমন্বয়গুলি ফ্লিপ করতে হবে।

CGContextTranslateCTM(context, 0, image.size.height);

এর অর্থ আমরা x অক্ষে 0 টি ইউনিট এবং y অক্ষের উপর চিত্রগুলির উচ্চতা দ্বারা চিত্রটি অনুবাদ করেছি। তবে, একা এটির অর্থ হ'ল আমাদের চিত্রটি এখনও বিপরীত, কেবল "চিত্র.সাইজ.হাইট" আঁকানো হচ্ছে যেখানে আমরা এটি আঁকতে চাই।

কোয়ার্টজ 2 ডি প্রোগ্রামিং গাইডটি স্কেলসিটিএম ব্যবহার এবং চিত্রটি উল্টানোর জন্য নেতিবাচক মানগুলি পাস করার পরামর্শ দেয়। এটি করতে আপনি নীচের কোডটি ব্যবহার করতে পারেন -

CGContextScaleCTM(context, 1.0, -1.0);

আপনার CGContextDrawImageকল করার ঠিক আগে দুটি একত্রিত করুন এবং আপনার চিত্রটি সঠিকভাবে আঁকানো উচিত।

UIImage *image = [UIImage imageNamed:@"testImage.png"];    
CGRect imageRect = CGRectMake(0, 0, image.size.width, image.size.height);       

CGContextTranslateCTM(context, 0, image.size.height);
CGContextScaleCTM(context, 1.0, -1.0);

CGContextDrawImage(context, imageRect, image.CGImage);

আপনার ইমেজরেট কো-অর্ডিনেটগুলি যদি আপনার ইমেজের সাথে মেলে না তবে কেবল সাবধান হন, যেমন আপনি অনিচ্ছাকৃত ফলাফল পেতে পারেন।

স্থানাঙ্কগুলি ফিরে রূপান্তর করতে:

CGContextScaleCTM(context, 1.0, -1.0);
CGContextTranslateCTM(context, 0, -imageRect.size.height);

এটি ভাল তবে আমি দেখতে পেলাম যে অন্যান্য জিনিসগুলি 0,0 এবং 1.0,1.0 এ ফিরে যাওয়ার চেষ্টা করার পরেও আমি অনুবাদ এবং স্কেল দ্বারা প্রভাবিত হচ্ছিলাম শেষ পর্যন্ত আমি কেন্ডালের সমাধানটি দিয়েছিলাম তবে আমি বুঝতে পেরেছি যে এটি ইউআইএমেজ ব্যবহার না করে বরং নিম্ন স্তরের সিজিআইমেজ স্টাফ যা আমরা এখানে কাজ করছি
চিনাবাদাম পাওয়ার

3
আপনি যদি ড্রইলায়ার ব্যবহার করছেন এবং কোনও সিজিআইমেজ্রিফকে প্রসঙ্গে দেখতে চান, তবে এই কৌশলটি এখানে চিকিত্সকের আদেশ চেয়েছে! যদি চিত্রটির জন্য রেকট থাকে, তবে সিজি কনটেক্সট ট্রান্সলেট্যাকটিএম (প্রসঙ্গ, 0, ইমেজ.সাইজ.হাইট + ইমেজ.ইরিগিন.ই) থাকে, তবে সিসি কনটেক্সটড্রাইজ্যামেজ () এর আগে rect.origin.y 0 এ সেট করুন। ধন্যবাদ!
ডেভিড এইচ

আমার একবার ইমেজম্যাগিক নিয়ে সমস্যা হয়েছিল যেখানে আইফোন ক্যামেরাটি ভুল দিকনির্দেশের ফলে তৈরি হয়েছিল। দেখা যাচ্ছে এটি চিত্র ফাইলে ওরিয়েন্টেশন ফ্ল্যাগটি করে, তাই প্রতিকৃতি চিত্রগুলি 960px x 640px বলে পতাকাটি "বাম" হিসাবে সেট করা আছে - যেমন বাম পাশের অংশটি শীর্ষ (বা এর কাছাকাছি কিছু) থাকে। এই থ্রেডটি সহায়তা করতে পারে: স্ট্যাকওভারফ্লো.com
হরি করম সিং

8
আপনি ব্যবহার করবেন না কেন CGContextSaveGState()এবং CGContextRestoreGState()সংরক্ষণ করুন এবং রূপান্তর ম্যাট্রিক্স পুনঃস্থাপন?
জ্যাক

20

উভয় দুনিয়ার সেরা, ইউআইআইমেজ ব্যবহার করুন drawAtPoint:বা drawInRect:এখনও আপনার কাস্টম প্রসঙ্গটি নির্দিষ্ট করার সময়:

UIGraphicsPushContext(context);
[image drawAtPoint:CGPointZero]; // UIImage will handle all especial cases!
UIGraphicsPopContext();

এছাড়াও আপনি আপনার প্রসঙ্গে CGContextTranslateCTMবা CGContextScaleCTMঅন্য উত্তরটি দিয়ে যা পরিবর্তন করবেন তা এড়াতে পারেন।


এটি দুর্দান্ত ধারণা, তবে আমার জন্য এটি এমন চিত্রের ফলস্বরূপ যা thatর্ধ্বমুখী এবং বাম থেকে ডান উভয় দিকের ছিল। আমি অনুমান করছি যে ফলাফলগুলি ইমেজ থেকে পরিবর্তিত হবে to
লুক রজার্স

সম্ভবত এটি পরে আইওএস প্রকাশের সাথে কাজ করা বন্ধ করে দিয়েছে? এই সময়ে এটি আমার জন্য সমস্ত কিছু নিয়ে কাজ করেছিল।
রিভেরা

আমি মনে করি এটি আসলে আমি কীভাবে প্রসঙ্গটি তৈরি করছি তার নিচে ছিল। একবার আমি UIGraphicsBeginImageContextWithOptionsকেবল নতুন উদ্ভাবনের পরিবর্তে ব্যবহার শুরু CGContextকরলে মনে হয় এটি কার্যকর হবে।
লুক রজার্স

12

প্রাসঙ্গিক কোয়ার্টজ 2 ডি ডক্স: https://developer.apple.com/library/ios/docamentation/2DDrawing/Concepual/DrawingPrintingiOS/ গ্রাফিক্সড্রেইংওভারভিউ / গ্রাফিক্স ড্রয়িং ওভারভিউ html#//apple_ref/doc/uid/CH40010156

ডিফল্ট সমন্বয় সিস্টেম উল্টানো

ইউআইকিট অঙ্কনটিতে উল্টানো ইউআইকিটের ডিফল্ট স্থানাঙ্ক সিস্টেমের সাথে এলএলও সমন্বয় ব্যবস্থা থাকা একটি অঙ্কন পরিবেশ সারিবদ্ধ করতে ব্যাকিং ক্যালিয়ারকে পরিবর্তন করে। আপনি যদি কেবল ইউআইকিট পদ্ধতি ব্যবহার করেন এবং অঙ্কনের জন্য ফাংশন করেন তবে আপনার সিটিএম ফ্লিপ করার দরকার নেই। তবে আপনি যদি ইউআইকিট কলগুলির সাথে কোর গ্রাফিক্স বা চিত্র I / O ফাংশন কলগুলি মিশ্রিত করেন, তবে সিটিএম ফ্লিপিংয়ের প্রয়োজন হতে পারে।

বিশেষত, আপনি যদি সরাসরি গ্রাফিক্স ফাংশনগুলিকে সরাসরি কল করে কোনও চিত্র বা পিডিএফ ডকুমেন্ট আঁকেন, তবে দৃশ্যটির প্রসঙ্গে অবজেক্টটি উপ-ডাউনভাবে উপস্থাপন করা হবে। চিত্র এবং পৃষ্ঠাগুলি সঠিকভাবে প্রদর্শন করতে আপনাকে অবশ্যই সিটিএম ফ্লিপ করতে হবে।

কোনও কোর গ্রাফিক্সের প্রসঙ্গে টানা কোনও বিষয়টিকে উল্টাতে যাতে কোনও ইউআইকিট ভিউতে প্রদর্শিত হয় তা সঠিকভাবে উপস্থিত হয়, আপনাকে অবশ্যই দুটি ধাপে সিটিএম পরিবর্তন করতে হবে। আপনি অঙ্কন ক্ষেত্রের উপরের-বাম কোণে উত্সটি অনুবাদ করুন এবং তারপরে আপনি y-স্থানাঙ্ক -1 দ্বারা সংশোধন করে একটি স্কেল অনুবাদ প্রয়োগ করবেন। এটি করার জন্য কোডটি নিম্নলিখিতগুলির মতো দেখায়:

CGContextSaveGState(graphicsContext);
CGContextTranslateCTM(graphicsContext, 0.0, imageHeight);
CGContextScaleCTM(graphicsContext, 1.0, -1.0);
CGContextDrawImage(graphicsContext, image, CGRectMake(0, 0, imageWidth, imageHeight));
CGContextRestoreGState(graphicsContext);

10

যদি কেউ প্রসঙ্গে কাস্টম রেক্টে একটি চিত্র আঁকার জন্য নন-ব্রেইনার সমাধানে আগ্রহী:

 func drawImage(image: UIImage, inRect rect: CGRect, context: CGContext!) {

    //flip coords
    let ty: CGFloat = (rect.origin.y + rect.size.height)
    CGContextTranslateCTM(context, 0, ty)
    CGContextScaleCTM(context, 1.0, -1.0)

    //draw image
    let rect__y_zero = CGRect(origin: CGPoint(x: rect.origin.x, y:0), size: rect.size)
    CGContextDrawImage(context, rect__y_zero, image.CGImage)

    //flip back
    CGContextScaleCTM(context, 1.0, -1.0)
    CGContextTranslateCTM(context, 0, -ty)

}

চিত্রটি রেকটটি পূরণ করতে স্কেল করা হবে।


7

আমি নিশ্চিত নই UIImage, তবে স্থানাঙ্কগুলি উল্টানো গেলে সাধারণত এই জাতীয় আচরণ হয় kind পোস্ট স্ক্রিপ্ট এবং পিডিএফ এর মতো বেশিরভাগ ওএস এক্স সমন্বিত সিস্টেমগুলির বাম নীচের কোণায় উত্পন্ন হয়। তবে CGImageসমন্বিত সিস্টেমটির উত্সটি বাম কোণার উপরের দিকে রয়েছে।

সম্ভাব্য সমাধানগুলিতে কোনও isFlippedসম্পত্তি বা scaleYBy:-1অ্যাফাইন ট্রান্সফর্ম জড়িত থাকতে পারে ।


3

UIImageCGImageএর প্রধান সামগ্রীর সদস্য হিসাবে রয়েছে স্কেলিং এবং ওরিয়েন্টেশন কারণগুলি a যেহেতু CGImageএবং এর বিভিন্ন ফাংশনগুলি ওএসএক্স থেকে উদ্ভূত, তাই এটি একটি সমন্বিত সিস্টেমের প্রত্যাশা করে যা আইফোনের তুলনায় উল্টো হয়। আপনি যখন একটি তৈরি করেন UIImage, এটি ক্ষতিপূরণ দেওয়ার জন্য একটি উল্টো দিকের দিকনির্দেশকে ডিফল্ট করে (আপনি এটি পরিবর্তন করতে পারেন!)। ব্যবহার . CGImageসম্পত্তি খুব শক্তিশালী CGImageফাংশন অ্যাক্সেস করতে , কিন্তু আইফোন স্ক্রিনে অঙ্কন ইত্যাদি UIImageপদ্ধতিগুলির সাহায্যে সবচেয়ে ভাল ।


1
আপনি কীভাবে ডিফল্ট উল্টো দিকে পরিবর্তন করবেন - ইউআইআইমেজের ডাউন ওরিয়েন্টেশন?
মেগাএএমএএনএক্স

3

সুইফট কোড সহ পরিপূরক উত্তর

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

কিছু প্রযুক্তি কোয়ার্টজ ব্যবহার করা ব্যবস্থার চেয়ে আলাদা ডিফল্ট স্থানাঙ্ক সিস্টেম ব্যবহার করে তাদের গ্রাফিক্স প্রসঙ্গগুলি সেট আপ করে। কোয়ার্টজের সাথে সম্পর্কিত, এই জাতীয় সমন্বয় ব্যবস্থা একটি পরিবর্তিত সমন্বয় ব্যবস্থা এবং কিছু কোয়ার্টজ অঙ্কন ক্রিয়াকলাপ সম্পাদন করার সময় অবশ্যই ক্ষতিপূরণ দিতে হবে। সর্বাধিক সাধারণ সংশোধিত সমন্বয় ব্যবস্থা প্রসঙ্গের উপরের বাম কোণে উত্সটি রাখে এবং y- অক্ষকে পৃষ্ঠার নীচের দিকে নির্দেশ করে।

এই ঘটনাটি কাস্টম ভিউগুলির নিম্নলিখিত দুটি ক্ষেত্রে দেখা যায় যা তাদের drawRectপদ্ধতিতে একটি চিত্র আঁকবে ।

এখানে চিত্র বর্ণনা লিখুন

বাম দিকে, চিত্রটি উল্টো দিকে এবং ডানদিকে স্থানাঙ্ক ব্যবস্থাটি অনুবাদ করা হয়েছে এবং ছোট করে দেওয়া হয়েছে যাতে উত্সটি উপরের বাম দিকে থাকে।

ওপারসাইড ডাউন চিত্র

override func drawRect(rect: CGRect) {

    // image
    let image = UIImage(named: "rocket")!
    let imageRect = CGRect(x: 0, y: 0, width: image.size.width, height: image.size.height)

    // context
    let context = UIGraphicsGetCurrentContext()

    // draw image in context
    CGContextDrawImage(context, imageRect, image.CGImage)

}

পরিবর্তিত সমন্বয় ব্যবস্থা

override func drawRect(rect: CGRect) {

    // image
    let image = UIImage(named: "rocket")!
    let imageRect = CGRect(x: 0, y: 0, width: image.size.width, height: image.size.height)

    // context
    let context = UIGraphicsGetCurrentContext()

    // save the context so that it can be undone later
    CGContextSaveGState(context)

    // put the origin of the coordinate system at the top left
    CGContextTranslateCTM(context, 0, image.size.height)
    CGContextScaleCTM(context, 1.0, -1.0)

    // draw the image in the context
    CGContextDrawImage(context, imageRect, image.CGImage)

    // undo changes to the context
    CGContextRestoreGState(context)
}


2

আমরা একই ফাংশনটি ব্যবহার করে এই সমস্যাটি সমাধান করতে পারি:

UIGraphicsBeginImageContext(image.size);

UIGraphicsPushContext(context);

[image drawInRect:CGRectMake(gestureEndPoint.x,gestureEndPoint.y,350,92)];

UIGraphicsPopContext();

UIGraphicsEndImageContext();

1

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

//Picture and irect don't conform, so there'll be stretching, compensate
    float xf = Picture.size.width/irect.size.width;
    float yf = Picture.size.height/irect.size.height;
    float m = MIN(xf, yf);
    xf /= m;
    yf /= m;
    CGContextScaleCTM(ctx, xf, yf);

    [Picture drawInRect: irect];

1

সুইফট 3 কোর গ্রাফিক্স সলিউশন

আপনি যদি ইউআইআইজেজের পরিবর্তে আপনার কারণ যা-ই হোন তার জন্য সিজি ব্যবহার করতে চান, পূর্ববর্তী উত্তরের উপর ভিত্তি করে এই সুইফট 3 নির্মাণটি আমার জন্য সমস্যাটি সমাধান করেছে:

if let cgImage = uiImage.cgImage {
    cgContext.saveGState()
    cgContext.translateBy(x: 0.0, y: cgRect.size.height)
    cgContext.scaleBy(x: 1.0, y: -1.0)
    cgContext.draw(cgImage, in: cgRect)
    cgContext.restoreGState()
}

1

এটি ঘটে কারণ কোয়ার্টজকোরের সমন্বয় ব্যবস্থা "নীচে-বাম" রয়েছে, যখন ইউআইকিট - "শীর্ষ-বাম"।

সেক্ষেত্রে আপনি সিজি কনটেক্সট প্রসারিত করতে পারেন :

extension CGContext {
  func changeToTopLeftCoordinateSystem() {
    translateBy(x: 0, y: boundingBoxOfClipPath.size.height)
    scaleBy(x: 1, y: -1)
  }
}

// somewhere in render 
ctx.saveGState()
ctx.changeToTopLeftCoordinateSystem()
ctx.draw(cgImage!, in: frame)

1

আমি এই সুইফট 5 , খাঁটি কোর গ্রাফিক্স এক্সটেনশনটি ব্যবহার করি যা সঠিকভাবে চিত্রের শৃঙ্খলায় শূন্য-অ-উত্সকে পরিচালনা করে:

extension CGContext {

    /// Draw `image` flipped vertically, positioned and scaled inside `rect`.
    public func drawFlipped(_ image: CGImage, in rect: CGRect) {
        self.saveGState()
        self.translateBy(x: 0, y: rect.origin.y + rect.height)
        self.scaleBy(x: 1.0, y: -1.0)
        self.draw(image, in: CGRect(origin: CGPoint(x: rect.origin.x, y: 0), size: rect.size))
        self.restoreGState()
    }
}

আপনি একেবারে CGContextনিয়মিত draw(: in:)পদ্ধতির মতো এটি ব্যবহার করতে পারেন :

ctx.drawFlipped(myImage, in: myRect)

0

আমার প্রকল্প চলাকালীন আমি ফোন থেকে লোড হওয়া চিত্রগুলির জন্য এই সমস্যাটি সমাধান করতে ক্ল্যান্ডের উত্তর থেকে কেন্ডালের উত্তর থেকে ঝাঁপিয়ে পড়েছি ।

শেষ পর্যন্ত আমি CGImageCreateWithPNGDataProviderপরিবর্তে ব্যবহার করে শেষ করেছি :

NSString* imageFileName = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"clockdial.png"];

return CGImageCreateWithPNGDataProvider(CGDataProviderCreateWithFilename([imageFileName UTF8String]), NULL, YES, kCGRenderingIntentDefault);

এটি ওরিয়েন্টেশন সংক্রান্ত সমস্যায় ভুগছে না যা আপনি CGImageএকটি থেকে পেয়ে যাবেন UIImageএবং এটি কোনও বাধা CALayerছাড়াই একটি সামগ্রী হিসাবে ব্যবহার করা যেতে পারে ।


0
func renderImage(size: CGSize) -> UIImage {
    return UIGraphicsImageRenderer(size: size).image { rendererContext in
        // flip y axis
        rendererContext.cgContext.translateBy(x: 0, y: size.height)
        rendererContext.cgContext.scaleBy(x: 1, y: -1)

        // draw image rotated/offsetted
        rendererContext.cgContext.saveGState()
        rendererContext.cgContext.translateBy(x: translate.x, y: translate.y)
        rendererContext.cgContext.rotate(by: rotateRadians)
        rendererContext.cgContext.draw(cgImage, in: drawRect)
        rendererContext.cgContext.restoreGState()
    }
}

0

@ ZpaceZombor এর দুর্দান্ত উত্তরের ভিত্তিতে সুইফ্ট 5 উত্তর answer

আপনার যদি কোনও ইউআইআইমেজ থাকে তবে কেবল ব্যবহার করুন

var image: UIImage = .... 
image.draw(in: CGRect)

আপনার যদি সিজিআইমেজ থাকে তবে নীচে আমার বিভাগটি ব্যবহার করুন

দ্রষ্টব্য: অন্য কয়েকটি উত্তরের বিপরীতে, এইটি বিবেচনা করে যে আপনি যে রেেক্টটি আঁকতে চান তার y থাকতে পারে! = 0. যে উত্তরগুলি বিবেচনায় নেয় না তারা ভুল এবং সাধারণ ক্ষেত্রে কাজ করবে না।

extension CGContext {
    final func drawImage(image: CGImage, inRect rect: CGRect) {

        //flip coords
        let ty: CGFloat = (rect.origin.y + rect.size.height)
        translateBy(x: 0, y: ty)
        scaleBy(x: 1.0, y: -1.0)

        //draw image
        let rect__y_zero = CGRect(x: rect.origin.x, y: 0, width: rect.width, height: rect.height)
        draw(image, in: rect__y_zero)

        //flip back
        scaleBy(x: 1.0, y: -1.0)
        translateBy(x: 0, y: -ty)

    }
} 

এটি ব্যবহার করুন:

let imageFrame: CGRect = ...
let context: CGContext = ....
let img: CGImage = ..... 
context.drawImage(image: img, inRect: imageFrame)

এটি প্রায় এক নিখুঁত সমাধান, তবে অঙ্কনের জন্য ফাংশনটি পরিবর্তন করার বিষয়টি বিবেচনা করুন (চিত্র: UIImage, InRect রেট: সিজিআরেক্ট) এবং পদ্ধতির ভিতরে uiImage.cgimage পরিচালনা করুন
মঙ্গলবার

-5

এটি করে আপনি এই সমস্যাটিও সমাধান করতে পারেন:

//Using an Image as a mask by directly inserting UIImageObject.CGImage causes
//the same inverted display problem. This is solved by saving it to a CGImageRef first.

//CGImageRef image = [UImageObject CGImage];

//CGContextDrawImage(context, boundsRect, image);

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