উত্তর:
রেটিনা প্রদর্শনের জন্য একটি চেক বিবেচনা করে নিম্নলিখিত কোড স্নিপেট ব্যবহার করুন:
#import <QuartzCore/QuartzCore.h>
if ([[UIScreen mainScreen] respondsToSelector:@selector(scale)]) {
UIGraphicsBeginImageContextWithOptions(self.window.bounds.size, NO, [UIScreen mainScreen].scale);
} else {
UIGraphicsBeginImageContext(self.window.bounds.size);
}
[self.window.layer renderInContext:UIGraphicsGetCurrentContext()];
UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
NSData *imageData = UIImagePNGRepresentation(image);
if (imageData) {
[imageData writeToFile:@"screenshot.png" atomically:YES];
} else {
NSLog(@"error while taking screenshot");
}
নীচে পদ্ধতিটি ওপেনজিএল অবজেক্টের জন্যও কাজ করে
//iOS7 or above
- (UIImage *) screenshot {
CGSize size = CGSizeMake(your_width, your_height);
UIGraphicsBeginImageContextWithOptions(size, NO, [UIScreen mainScreen].scale);
CGRect rec = CGRectMake(0, 0, your_width, your_height);
[_viewController.view drawViewHierarchyInRect:rec afterScreenUpdates:YES];
UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return image;
}
UIGetScreenImage
একটি ব্যক্তিগত এপিআই
UIGraphicsBeginImageContextWithOptions(self.view.bounds.size, self.view.opaque, 0.0);
[self.myView.layer renderInContext:UIGraphicsGetCurrentContext()];
UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
NSData *imageData = UIImageJPEGRepresentation(image, 1.0 ); //you can use PNG too
[imageData writeToFile:@"image1.jpeg" atomically:YES];
- (UIImage*) getGLScreenshot {
NSInteger myDataLength = 320 * 480 * 4;
// allocate array and read pixels into it.
GLubyte *buffer = (GLubyte *) malloc(myDataLength);
glReadPixels(0, 0, 320, 480, GL_RGBA, GL_UNSIGNED_BYTE, buffer);
// gl renders "upside down" so swap top to bottom into new array.
// there's gotta be a better way, but this works.
GLubyte *buffer2 = (GLubyte *) malloc(myDataLength);
for(int y = 0; y <480; y++)
{
for(int x = 0; x <320 * 4; x++)
{
buffer2[(479 - y) * 320 * 4 + x] = buffer[y * 4 * 320 + x];
}
}
// make data provider with data.
CGDataProviderRef provider = CGDataProviderCreateWithData(NULL, buffer2, myDataLength, NULL);
// prep the ingredients
int bitsPerComponent = 8;
int bitsPerPixel = 32;
int bytesPerRow = 4 * 320;
CGColorSpaceRef colorSpaceRef = CGColorSpaceCreateDeviceRGB();
CGBitmapInfo bitmapInfo = kCGBitmapByteOrderDefault;
CGColorRenderingIntent renderingIntent = kCGRenderingIntentDefault;
// make the cgimage
CGImageRef imageRef = CGImageCreate(320, 480, bitsPerComponent, bitsPerPixel, bytesPerRow, colorSpaceRef, bitmapInfo, provider, NULL, NO, renderingIntent);
// then make the uiimage from that
UIImage *myImage = [UIImage imageWithCGImage:imageRef];
return myImage;
}
- (void)saveGLScreenshotToPhotosAlbum {
UIImageWriteToSavedPhotosAlbum([self getGLScreenshot], nil, nil, nil);
}
উত্স ।
UIImage *myImage = [[UIImage alloc] initWithCGImage:imageRef scale:1.0 orientation:UIImageOrientationDownMirrored];
এবং আপনার আর 'বাফার 2' লাগবে না। বিটিডাব্লু মনে হচ্ছে আপনি মেমরি পরিচালনা সম্পর্কে ভুলে গেছেন, কোনও ফ্রি () বা রিলিজ () কল নেই ...
সুইফ ইন
func captureScreen() -> UIImage
{
UIGraphicsBeginImageContextWithOptions(self.view.bounds.size, false, 0);
self.view.drawViewHierarchyInRect(view.bounds, afterScreenUpdates: true)
let image: UIImage = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
return image
}
আইওএস 10 হিসাবে এটি কিছুটা সহজতর হয়। ইউআইকিট আসে UIGraphicsImageRender
যা আপনাকে অনুমতি দেয়
... রঙিন গভীরতা এবং চিত্র স্কেল, বা কোর গ্রাফিক্স প্রসঙ্গগুলি পরিচালনা করার মতো কনফিগারেশন পরিচালনা না করেই অঙ্কন কাজগুলি সম্পন্ন করুন
অ্যাপল ডক্স - ইউআইজিগ্রাফিকস আইমেজ রেন্ডারার
সুতরাং আপনি এখন এর মতো কিছু করতে পারেন:
let renderer = UIGraphicsImageRenderer(size: someView.bounds.size)
let image = renderer.image(actions: { context in
someView.drawHierarchy(in: someView.bounds, afterScreenUpdates: true)
})
এখানে বেশিরভাগ উত্তর বেশিরভাগ ক্ষেত্রেই আমার পক্ষে কাজ করেছিল। তবে কোনওটির স্ন্যাপশট নেওয়ার চেষ্টা করার সময় ARSCNView
, আমি উপরে বর্ণিত পদ্ধতিটি ব্যবহার করে এটি করতে সক্ষম হয়েছি। যদিও এটি লক্ষণীয় যে এই মুহুর্তে, এআরকিট এখনও বিটাতে রয়েছে এবং এক্সকোড বিটা 4 এ রয়েছে
এটি একটি স্ক্রিনশট সংরক্ষণ করবে এবং পাশাপাশি স্ক্রিনশটটিও ফিরিয়ে দেবে।
-(UIImage *)capture{
UIGraphicsBeginImageContext(self.view.bounds.size);
[self.view.layer renderInContext:UIGraphicsGetCurrentContext()];
UIImage *imageView = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
UIImageWriteToSavedPhotosAlbum(imageView, nil, nil, nil); //if you need to save
return imageView;
}
আমি মনে করি নীচের স্নিপেটটি যদি আপনি একটি পূর্ণ স্ক্রিন নিতে চান ( স্ট্যাটাস বার ব্যতীত ), প্রয়োজনে কেবল অ্যাপডেলিগেটের সাথে আপনার অ্যাপের প্রতিনিধি নামটি প্রতিস্থাপন করুন।
- (UIImage *)captureFullScreen {
AppDelegate *_appDelegate = (AppDelegate *)[UIApplication sharedApplication].delegate;
if ([[UIScreen mainScreen] respondsToSelector:@selector(scale)]) {
// for retina-display
UIGraphicsBeginImageContextWithOptions(_appDelegate.window.bounds.size, NO, [UIScreen mainScreen].scale);
[_appDelegate.window drawViewHierarchyInRect:_appDelegate.window.bounds afterScreenUpdates:NO];
} else {
// non-retina-display
UIGraphicsBeginImageContext(_bodyView.bounds.size);
[_appDelegate.window drawViewHierarchyInRect:_appDelegate.window.bounds afterScreenUpdates:NO];
}
UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return image;
}
সুইফট 3 বাস্তবায়নের সাথে আমি কোনও উত্তর খুঁজে পাইনি। সুতরাং এখানে এটি যায়।
static func screenshotOf(window: UIWindow) -> UIImage? {
UIGraphicsBeginImageContextWithOptions(window.bounds.size, true, UIScreen.main.scale)
guard let currentContext = UIGraphicsGetCurrentContext() else {
return nil
}
window.layer.render(in: currentContext)
guard let image = UIGraphicsGetImageFromCurrentImageContext() else {
UIGraphicsEndImageContext()
return nil
}
UIGraphicsEndImageContext()
return image
}
আইওএস 7.0 বা ততোধিকের জন্য ..
আপনি যদি বলার স্ক্রিনশট নিতে চান (মাইভিউ), আপনি একক লাইন দিয়ে এটি করতে পারেন:
[myView snapshotViewAfterScreenUpdates:NO];
এটি দ্রুত 4.2 এর সাথে কাজ করবে , স্ক্রিনশটটি লাইব্রেরিতে সংরক্ষণ করা হবে, তবে দয়া করে এডিট করতে ভুলবেন না info.plist @ NSPhotoLibraryAddUsageDescription
:
@IBAction func takeScreenshot(_ sender: UIButton) {
//Start full Screenshot
print("full Screenshot")
UIGraphicsBeginImageContext(card.frame.size)
view.layer.render(in: UIGraphicsGetCurrentContext()!)
var sourceImage = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
UIImageWriteToSavedPhotosAlbum(sourceImage!, nil, nil, nil)
//Start partial Screenshot
print("partial Screenshot")
UIGraphicsBeginImageContext(card.frame.size)
sourceImage?.draw(at: CGPoint(x:-25,y:-100)) //the screenshot starts at -25, -100
var croppedImage = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
UIImageWriteToSavedPhotosAlbum(croppedImage!, nil, nil, nil)
}
ভিউ থেকে স্ক্রিনশট পান
-(UIImage *)getScreenshotImage {
if ([[UIScreen mainScreen] scale] == 2.0) {
UIGraphicsBeginImageContextWithOptions(self.view.frame.size, FALSE, 2.0);
} else {
UIGraphicsBeginImageContextWithOptions(self.view.frame.size, FALSE, 1.0);
}
[self.view.window.layer renderInContext:UIGraphicsGetCurrentContext()];
UIImage * result = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return result;
}
ফটোতে ছবি সংরক্ষণ করুন
UIImageWriteToSavedPhotosAlbum(YOUR_IMAGE, nil, nil, nil);
কিভাবে
UIImageWriteToSavedPhotosAlbum([self getScreenshotImage], nil, nil, nil);
দৃশ্য থেকে স্ক্রিনশট পান:
- (UIImage *)takeSnapshotView {
CGRect rect = [myView bounds];//Here you can change your view with myView
UIGraphicsBeginImageContextWithOptions(rect.size,YES,0.0f);
CGContextRef context = UIGraphicsGetCurrentContext();
[myView.layer renderInContext:context];
UIImage *capturedScreen = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return capturedScreen;//capturedScreen is the image of your view
}
আশা করি, আপনি এটিই খুঁজছেন কোন উদ্বেগ আমার কাছে ফিরে। :)
আমি এই প্রশ্নের উত্তর দিচ্ছি কারণ এটি একটি সর্বাধিক দেখা হয়েছে, এবং সেখানে অনেক উত্তর রয়েছে এবং এখানে সুইফট এবং ওবজ-সি রয়েছে।
দাবি অস্বীকার এটি আমার কোড বা আমার উত্তর নয়, এটি কেবল এখানে ভূমির লোকদের দ্রুত উত্তর খুঁজে পেতে সহায়তা করার জন্য। ক্রেডিট দেওয়ার জন্য মূল উত্তরের লিঙ্কগুলি রয়েছে যেখানে creditণ দেওয়ার কথা !! আপনি যদি তাদের উত্তরটি ব্যবহার করেন তবে দয়া করে মূল উত্তরগুলিকে একটি +1 দিয়ে সম্মান করুন!
#import <QuartzCore/QuartzCore.h>
if ([[UIScreen mainScreen] respondsToSelector:@selector(scale)]) {
UIGraphicsBeginImageContextWithOptions(self.window.bounds.size, NO, [UIScreen mainScreen].scale);
} else {
UIGraphicsBeginImageContext(self.window.bounds.size);
}
[self.window.layer renderInContext:UIGraphicsGetCurrentContext()];
UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
NSData *imageData = UIImagePNGRepresentation(image);
if (imageData) {
[imageData writeToFile:@"screenshot.png" atomically:YES];
} else {
NSLog(@"error while taking screenshot");
}
func captureScreen() -> UIImage
{
UIGraphicsBeginImageContextWithOptions(self.view.bounds.size, false, 0);
self.view.drawViewHierarchyInRect(view.bounds, afterScreenUpdates: true)
let image: UIImage = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
return image
}
দ্রষ্টব্য: প্রোগ্রামিং সহ প্রকৃতি হিসাবে আপডেটগুলি করা দরকার হতে পারে তাই সম্পাদনা করুন বা আমাকে জানান! * এছাড়াও আমি যদি উত্তর / পদ্ধতির মূল্য অন্তর্ভুক্ত করতে ব্যর্থ হই তবে আমাকেও অবহিত করুন!
আরেকটি বিকল্প হ'ল যন্ত্রগুলিতে অটোমেশন সরঞ্জামটি ব্যবহার করা। আপনি যা চান রাজ্যে স্ক্রিন রাখার জন্য আপনি একটি স্ক্রিপ্ট লেখেন, তারপরে শটগুলি নিন। আমি আমার অ্যাপগুলির একটির জন্য ব্যবহৃত স্ক্রিপ্টটি এখানে দিচ্ছি। স্পষ্টতই, স্ক্রিপ্টের বিবরণগুলি আপনার অ্যাপ্লিকেশনের জন্য আলাদা হবে।
var target = UIATarget.localTarget();
var app = target.frontMostApp();
var window = app.mainWindow();
var picker = window.pickers()[0];
var wheel = picker.wheels()[2];
var buttons = window.buttons();
var button1 = buttons.firstWithPredicate("name == 'dateButton1'");
var button2 = buttons.firstWithPredicate("name == 'dateButton2'");
function setYear(picker, year) {
var yearName = year.toString();
var yearWheel = picker.wheels()[2];
yearWheel.selectValue(yearName);
}
function setMonth(picker, monthName) {
var wheel = picker.wheels()[0];
wheel.selectValue(monthName);
}
function setDay(picker, day) {
var wheel = picker.wheels()[1];
var name = day.toString();
wheel.selectValue(name);
}
target.delay(1);
setYear(picker, 2015);
setMonth(picker, "July");
setDay(picker, 4);
button1.tap();
setYear(picker, 2015);
setMonth(picker, "December");
setDay(picker, 25);
target.captureScreenWithName("daysShot1");
var nButtons = buttons.length;
UIALogger.logMessage(nButtons + " buttons");
for (var i=0; i<nButtons; i++) {
UIALogger.logMessage("button " + buttons[i].name());
}
var tabBar = window.tabBars()[0];
var barButtons = tabBar.buttons();
var nBarButtons = barButtons.length;
UIALogger.logMessage(nBarButtons + " buttons on tab bar");
for (var i=0; i<nBarButtons; i++) {
UIALogger.logMessage("button " + barButtons[i].name());
}
var weeksButton = barButtons[1];
var monthsButton = barButtons[2];
var yearsButton = barButtons[3];
target.delay(2);
weeksButton.tap();
target.captureScreenWithName("daysShot2");
target.delay(2);
monthsButton.tap();
target.captureScreenWithName("daysShot3");
target.delay(2);
yearsButton.tap();
target.delay(2);
button2.tap();
target.delay(2);
setYear(picker, 2018);
target.delay(2);
target.captureScreenWithName("daysShot4");
বেলো সাইটে দুটি বিকল্প উপলব্ধ:
বিকল্প 1: ইউআই উইন্ডো ব্যবহার করে (চেষ্টা করুন এবং নিখুঁতভাবে কাজ করুন)
// create graphics context with screen size
CGRect screenRect = [[UIScreen mainScreen] bounds];
UIGraphicsBeginImageContext(screenRect.size);
CGContextRef ctx = UIGraphicsGetCurrentContext();
[[UIColor blackColor] set];
CGContextFillRect(ctx, screenRect);
// grab reference to our window
UIWindow *window = [UIApplication sharedApplication].keyWindow;
// transfer content into our context
[window.layer renderInContext:ctx];
UIImage *screengrab = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
বিকল্প 2: ইউআইভিউ ব্যবহার করে
// grab reference to the view you'd like to capture
UIView *wholeScreen = self.splitViewController.view;
// define the size and grab a UIImage from it
UIGraphicsBeginImageContextWithOptions(wholeScreen.bounds.size, wholeScreen.opaque, 0.0);
[wholeScreen.layer renderInContext:UIGraphicsGetCurrentContext()];
UIImage *screengrab = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
রেটিনা পর্দার জন্য (ডেনউকেম উত্তর হিসাবে)
// grab reference to our window
UIWindow *window = [UIApplication sharedApplication].keyWindow;
// create graphics context with screen size
CGRect screenRect = [[UIScreen mainScreen] bounds];
if ([[UIScreen mainScreen] respondsToSelector:@selector(scale)]) {
UIGraphicsBeginImageContextWithOptions(screenRect.size, NO, [UIScreen mainScreen].scale);
} else {
UIGraphicsBeginImageContext(screenRect.size);
[window.layer renderInContext:UIGraphicsGetCurrentContext()];
}
আরও বিশদ জন্য: http://pinkstone.co.uk/how-to-take-a-screeshot-in-ios-programmatically/
কেবলমাত্র একটি ছোট অবদান, আমি এটি একটি বোতাম দিয়ে করেছি তবে টিপে টিপানোর অর্থ হ'ল বোতামটি চেপে ধরেছে। তাই প্রথমে আমি আলোকপাত করি।
- (IBAction)screenShot:(id)sender {
// Unpress screen shot button
screenShotButton.highlighted = NO;
// create graphics context with screen size
CGRect screenRect = [[UIScreen mainScreen] bounds];
if ([[UIScreen mainScreen] respondsToSelector:@selector(scale)]) {
UIGraphicsBeginImageContextWithOptions(self.view.bounds.size, NO, [UIScreen mainScreen].scale);
} else {
UIGraphicsBeginImageContext(self.view.bounds.size);
}
CGContextRef ctx = UIGraphicsGetCurrentContext();
[[UIColor blackColor] set];
CGContextFillRect(ctx, screenRect);
// grab reference to our window
UIWindow *window = [UIApplication sharedApplication].keyWindow;
// transfer content into our context
[window.layer renderInContext:ctx];
UIImage *screengrab = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
// save screengrab to Camera Roll
UIImageWriteToSavedPhotosAlbum(screengrab, nil, nil, nil);
}
আমি কোডটির মূল অংশটি পেয়েছি: http://pinkstone.co.uk/how-to-take-a-screeshot-in-ios-programmatically/ যেখানে আমি বিকল্প 1 ব্যবহার করেছি, বিকল্প 2 কাজ করছে বলে মনে হচ্ছে না আমার জন্য. এই থ্রেড থেকে রেন্টিনা স্ক্রিন আকারের জন্য সামঞ্জস্যগুলি এবং স্ক্রিনশটবটনের আনহাইটলাইটিং যুক্ত করেছে। আমি যে ভিউটিটিতে এটি ব্যবহার করছি তা হ'ল স্টোরিবোর্ডেড বোতাম এবং লেবেলের স্ক্রিন এবং বেশ কয়েকটি ইউআইভিউ সহ পরে প্রোগ্রামটির মাধ্যমে যুক্ত করা হয়েছে।
সুইফটে আপনি নিম্নলিখিত কোডটি ব্যবহার করতে পারেন।
if UIScreen.mainScreen().respondsToSelector(Selector("scale")) {
UIGraphicsBeginImageContextWithOptions(self.window!.bounds.size, false, UIScreen.mainScreen().scale)
}
else{
UIGraphicsBeginImageContext(self.window!.bounds.size)
}
self.window?.layer.renderInContext(UIGraphicsGetCurrentContext())
var image : UIImage = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
UIImageWriteToSavedPhotosAlbum(image, nil, nil, nil)
সুইফট 4:
func makeImage(withView view: UIView) -> UIImage? {
let rect = view.bounds
UIGraphicsBeginImageContextWithOptions(rect.size, true, 0)
guard let context = UIGraphicsGetCurrentContext() else {
assertionFailure()
return nil
}
view.layer.render(in: context)
guard let image = UIGraphicsGetImageFromCurrentImageContext() else {
assertionFailure()
return nil
}
UIGraphicsEndImageContext()
return image
}