ios - mini - como hacer captura de pantalla en pc windows 10
Capture una captura de pantalla de UIView-Slow Performance (2)
Tengo una aplicación de dibujo, me gustaría crear una instantánea del Canvas UIView (tanto dentro como fuera de la pantalla) y luego reducirla. El código que tengo para hacer eso toma sangrienta para siempre en un iPad 3. Simulador no hay retraso. El lienzo es 2048x2048.
¿Hay alguna otra forma en que debería estar haciendo esto? O algo que extraño en el código?
¡Gracias!
-(UIImage *) createScreenShotThumbnailWithWidth:(CGFloat)width{
// Size of our View
CGSize size = editorContentView.bounds.size;
//First Grab our Screen Shot at Full Resolution
UIGraphicsBeginImageContext(size);
[editorContentView.layer renderInContext:UIGraphicsGetCurrentContext()];
UIImage *screenShot = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
//Calculate the scal ratio of the image with the width supplied.
CGFloat ratio = 0;
if (size.width > size.height) {
ratio = width / size.width;
} else {
ratio = width / size.height;
}
//Setup our rect to draw the Screen shot into
CGSize newSize = CGSizeMake(ratio * size.width, ratio * size.height);
//Send back our screen shot
return [self imageWithImage:screenShot scaledToSize:newSize];
}
¿ Utilizaste el instrumento "Time Profiler" (menú "Producto" -> "Perfil") para verificar en qué parte del código pasas la mayor parte del tiempo? (Úselo con su dispositivo por supuesto, no el simulador, para tener un perfil realista). Supongo que no está en la porción de captura de imagen que citó en su pregunta, sino en su método de imageWithImage:scaledToSize:
method.
En lugar de representar la imagen en su tamaño completo en un contexto, y luego redimensionar la imagen al tamaño final, debe representar la capa en el contexto directamente en el tamaño esperado aplicando alguna transformación afín al contexto .
Simplemente use CGContextConcatCTM(someScalingAffineTransform);
en UIGraphicsGetCurrentContext()
justo después de su línea UIGraphicsBeginImageContext(size);
, para aplicar una transformación afín de escalado que hará que la capa se represente a una escala / tamaño diferente.
De esta manera, se representará directamente como el tamaño esperado, que será mucho más rápido, en lugar de renderizado al 100% y luego tendrá que volver a escalarlo de una manera que consume mucho tiempo.
Gracias AliSoftware , aquí está el código que terminé usando:
-(UIImage *) createScreenShotThumbnailWithWidth:(CGFloat)width{
if (IoUIDebug & IoUIDebugSelectorNames) {
NSLog(@"%@ - %@", INTERFACENAME, NSStringFromSelector(_cmd) );
}
// Size of our View
CGSize size = editorContentView.bounds.size;
//Calculate the scal ratio of the image with the width supplied.
CGFloat ratio = 0;
if (size.width > size.height) {
ratio = width / size.width;
} else {
ratio = width / size.height;
}
CGSize newSize = CGSizeMake(ratio * size.width, ratio * size.height);
//Create GraphicsContext with our new size
UIGraphicsBeginImageContext(newSize);
//Create Transform to scale down the Context
CGAffineTransform transform = CGAffineTransformIdentity;
transform = CGAffineTransformScale(transform, ratio, ratio);
//Apply the Transform to the Context
CGContextConcatCTM(UIGraphicsGetCurrentContext(),transform);
//Render our Image into the the Scaled Graphic Context
[editorContentView.layer renderInContext:UIGraphicsGetCurrentContext()];
//Save a copy of the Image of the Graphic Context
UIImage* screenShot = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return screenShot;
}