2016-08-01 36 views
4

Ich arbeite an iOS-Anwendung, in der Aufnahme deutlich Screenshot erforderlich nehmen Ich habeWie klar SCREENSHOT IOS

versucht
func captureView() -> UIImage { 
     //hide controls if needed 
     let rect: CGRect = self.imageView.frame 
     UIGraphicsBeginImageContext(rect.size) 
     let context: CGContextRef = UIGraphicsGetCurrentContext()! 
     self.view.layer.renderInContext(context) 
     let img: UIImage = UIGraphicsGetImageFromCurrentImageContext() 
     UIGraphicsEndImageContext() 
     return img 
    } 

Aber die Qualität des Bildes ist nicht gut. Bitte schlage mir etwas vor.

+2

Haben Sie versucht, mit: http://stackoverflow.com/questions/14797104/taking-screenshot-of-high-quality-ios? –

Antwort

6

Änderung der Linie

UIGraphicsBeginImageContext(rect.size) 

zu

UIGraphicsBeginImageContextWithOptions(rect.size, false, 0.0); 
+0

super bro nur deine lösung funktioniert .. – JAck

+0

toll! happy swift coding ... –

+0

liebe hast du irgendeine idee in demselben code .. ich bekomme kein richtiges bild von imageView – JAck

0

Verwendung

UIGraphicsBeginImageContextWithOptions(your size, opaque, scale

statt

UIGraphicsBeginImageContext(rect.size)

0

Der letzte Parameter in UIGraphicsBeginImageContextWithOptions ist scale. Wenn Sie nur eine hohe Auflösung benötigen, versuchen Sie, einen Wert für die Skalierung auf 1,0 zu setzen.

func captureView() -> UIImage { 
     //hide controls if needed 
     let rect: CGRect = self.imageView.frame 

     UIGraphicsBeginImageContextWithOptions(rect.size, true, 1.0)//add this line 

     let context: CGContextRef = UIGraphicsGetCurrentContext()! 
     self.view.layer.renderInContext(context) 
     let img: UIImage = UIGraphicsGetImageFromCurrentImageContext() 
     UIGraphicsEndImageContext() 
     return img 
    } 
3

Fügen Sie den folgenden Codeblock in eine neue Datei ein. Und da gehst du.

extension UIView { 

    // Convert a uiview to uiimage 
     func captureView() -> UIImage { 
      // Gradually increase the number for high resolution.  
      let scale = 1.0 

      UIGraphicsBeginImageContextWithOptions(bounds.size, opaque, scale) 

      layer.renderInContext(UIGraphicsGetCurrentContext()!) 
      let image:UIImage = UIGraphicsGetImageFromCurrentImageContext() 
      UIGraphicsEndImageContext() 

      return image 
     } 
    } 

Jetzt können Sie captureView() auf jeder Unterklasse von UIView und UIView nennen sich die UIImage der Ansicht zu erhalten.

Sie können den Wert scale in UIGraphicsBeginImageContextWithOptions Methode ändern, um ein Bild mit hoher Auflösung zu erhalten.

+0

einfach ..... Excellent –

1

können Sie die IOSurface verwenden privaten Rahmen zu tun, so

IOMobileFramebufferConnection connect; 
kern_return_t result; 
IOSurfaceRef screenSurface = NULL; 

io_service_t framebufferService = IOServiceGetMatchingService(kIOMasterPortDefault, IOServiceMatching("AppleH1CLCD")); 
if(!framebufferService) 
    framebufferService = IOServiceGetMatchingService(kIOMasterPortDefault, IOServiceMatching("AppleM2CLCD")); 
if(!framebufferService) 
    framebufferService = IOServiceGetMatchingService(kIOMasterPortDefault, IOServiceMatching("AppleCLCD")); 

result = IOMobileFramebufferOpen(framebufferService, mach_task_self(), 0, &connect); 

result = IOMobileFramebufferGetLayerDefaultSurface(connect, 0, &screenSurface); 

uint32_t aseed; 
IOSurfaceLock(screenSurface, kIOSurfaceLockReadOnly, &aseed); 
uint32_t width = IOSurfaceGetWidth(screenSurface); 
uint32_t height = IOSurfaceGetHeight(screenSurface); 

CFMutableDictionaryRef dict; 
int pitch = width*4, size = width*height*4; 
int bPE=4; 
char pixelFormat[4] = {'A','R','G','B'}; 
dict = CFDictionaryCreateMutable(kCFAllocatorDefault, 0, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks); 
CFDictionarySetValue(dict, kIOSurfaceIsGlobal, kCFBooleanTrue); 
CFDictionarySetValue(dict, kIOSurfaceBytesPerRow, CFNumberCreate(kCFAllocatorDefault, kCFNumberSInt32Type, &pitch)); 
CFDictionarySetValue(dict, kIOSurfaceBytesPerElement, CFNumberCreate(kCFAllocatorDefault, kCFNumberSInt32Type, &bPE)); 
CFDictionarySetValue(dict, kIOSurfaceWidth, CFNumberCreate(kCFAllocatorDefault, kCFNumberSInt32Type, &width)); 
CFDictionarySetValue(dict, kIOSurfaceHeight, CFNumberCreate(kCFAllocatorDefault, kCFNumberSInt32Type, &height)); 
CFDictionarySetValue(dict, kIOSurfacePixelFormat, CFNumberCreate(kCFAllocatorDefault, kCFNumberSInt32Type, pixelFormat)); 
CFDictionarySetValue(dict, kIOSurfaceAllocSize, CFNumberCreate(kCFAllocatorDefault, kCFNumberSInt32Type, &size)); 

IOSurfaceRef destSurf = IOSurfaceCreate(dict); 

void* outAcc; 
IOSurfaceAcceleratorCreate(NULL, 0, &outAcc); 

IOSurfaceAcceleratorTransferSurface(outAcc, screenSurface, destSurf, dict, NULL); 

IOSurfaceUnlock(screenSurface, kIOSurfaceLockReadOnly, &aseed); 
CFRelease(outAcc); 

CGDataProviderRef provider = CGDataProviderCreateWithData(NULL, IOSurfaceGetBaseAddress(destSurf), (width * height * 4), NULL); 
CGImageRef cgImage=CGImageCreate(width, height, 8, 
           8*4, IOSurfaceGetBytesPerRow(destSurf), 
           CGColorSpaceCreateDeviceRGB(), kCGImageAlphaNoneSkipFirst |kCGBitmapByteOrder32Little, 
           provider, NULL, 
           YES, kCGRenderingIntentDefault); 
UIImage *img = [UIImage imageWithCGImage:cgImage];