我试图获取一个包含SKScene的视图的屏幕抓取.我使用的技术是:
UIGraphicsBeginImageContextWithOptions(self.view.bounds.size, NO, scale);
[self.view.layer renderInContext:UIGraphicsGetCurrentContext()];
UIImage *viewImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
Run Code Online (Sandbox Code Playgroud)
这适用于普通的UIViews,但无论出于何种原因,它忽略了SKScene中的所有精灵.
我不确定这是否是一个错误,或者Sprite Kit的渲染是否与UIGraphics分开.
问题:当UIViews的工作方式似乎无法与Sprite Kit一起使用时,或者是否有人使用Sprite Kit使用UIGraphics上下文时,如何获取SKScene的屏幕抓取?
当我们获得UIView的屏幕截图时,我们通常使用以下代码:
UIGraphicsBeginImageContextWithOptions(frame.size, false, scale)
drawViewHierarchyInRect(bounds, afterScreenUpdates: true)
var image:UIImage = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
Run Code Online (Sandbox Code Playgroud)
drawViewHierarchyInRect && UIGraphicsGetImageFromCurrentImageContext将在当前上下文中生成图像,但在调用时不会释放 内存UIGraphicsEndImageContext.
内存使用继续增加,直到应用程序崩溃.
虽然有一个词UIGraphicsEndImageContext会CGContextRelease自动调用",但它不起作用.
我该如何释放内存drawViewHierarchyInRect或UIGraphicsGetImageFromCurrentImageContext使用
有没有生成截图没有drawViewHierarchyInRect?
1自动释放:不起作用
var image:UIImage?
autoreleasepool{
UIGraphicsBeginImageContextWithOptions(frame.size, false, scale)
drawViewHierarchyInRect(bounds, afterScreenUpdates: true)
image = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
}
image = nil
Run Code Online (Sandbox Code Playgroud)
2 UnsafeMutablePointer:不起作用
var image:UnsafeMutablePointer<UIImage> = UnsafeMutablePointer.alloc(1)
autoreleasepool{
UIGraphicsBeginImageContextWithOptions(frame.size, false, scale)
drawViewHierarchyInRect(bounds, afterScreenUpdates: true)
image.initialize(UIGraphicsGetImageFromCurrentImageContext())
UIGraphicsEndImageContext()
}
image.destroy()
image.delloc(1)
Run Code Online (Sandbox Code Playgroud) 所以我想在地图上显示一些图片作为注释.为此,我需要添加MKAnnotationView的image属性.我正在使用常规图像,但我希望它们是圆形的并带有边框.所以我找到了一种圆形UIImage的方法,我找到了为UIImage添加边框的方法,但边框似乎没有添加(我实际上并没有在屏幕上显示图像,也许这就是问题?).
我使用了这个答案/sf/answers/2033316071/稍作修改边框.即:
imageView.layer.borderWidth = 1.5
imageView.layer.borderColor = UIColor.whiteColor().CGColor
imageView.clipsToBounds = true
Run Code Online (Sandbox Code Playgroud)
但我在地图上的图像没有任何边框.有什么建议 ?
我尝试了所建议的但是输出是一个白色的空白截图.这让我想到我没有在视图中添加任何内容.这是我在视图中添加图形的方法.addChild方法附带SpriteKit,它接收SKSpriteNodes:
addChild(background)
addChild(rate)
addChild(scoreLabel)
addChild(share)
addChild(playAgain)
addChild(highScoreLabel)
addChild(scoreBackground)
addChild(highScoreBackground)
Run Code Online (Sandbox Code Playgroud)
以下是截取屏幕截图的方法:
UIGraphicsBeginImageContext(self.view!.bounds.size)
self.view!.layer.renderInContext(UIGraphicsGetCurrentContext())
let screenshot = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
UIImageWriteToSavedPhotosAlbum(screenshot, nil, nil, nil)
Run Code Online (Sandbox Code Playgroud)
任何的意见都将会有帮助
我正在使用Xamarin进行开发,并希望在其中绘制一个带有"CIRCLE"文本的简单圆圈,并在UIImageView中显示该图像.问题是圆圈和文字显得非常模糊.我已经阅读了一些有关子像素的内容,但我认为这不是我的问题.
这是模糊的图像和代码,希望有人有一些想法:)
UIGraphics.BeginImageContext (new SizeF(150,150));
var context = UIGraphics.GetCurrentContext ();
var content = "CIRCLE";
var font = UIFont.SystemFontOfSize (16);
const float width = 150;
const float height = 150;
context.SetFillColorWithColor (UIColor.Red.CGColor);
context.FillEllipseInRect (new RectangleF (0, 0, width, height));
var contentString = new NSString (content);
var contentSize = contentString.StringSize (font);
var rect = new RectangleF (0, ((height - contentSize.Height) / 2) + 0, width, contentSize.Height);
context.SetFillColorWithColor (UIColor.White.CGColor);
new NSString (content).DrawString (rect, font, UILineBreakMode.WordWrap, UITextAlignment.Center);
var image = UIGraphics.GetImageFromCurrentImageContext ();
imageView.Image = …Run Code Online (Sandbox Code Playgroud) func drawOnPDF(path: String)
{
// Get existing Pdf reference
let pdf = CGPDFDocumentCreateWithURL(NSURL(fileURLWithPath: path))
// Get page count of pdf, so we can loop through pages and draw them accordingly
let pageCount = CGPDFDocumentGetNumberOfPages(pdf);
// Write to file
UIGraphicsBeginPDFContextToFile(path, CGRectZero, nil)
// Write to data
// var data = NSMutableData()
// UIGraphicsBeginPDFContextToData(data, CGRectZero, nil)
for index in 1...pageCount {
let page = CGPDFDocumentGetPage(pdf, index)
let pageFrame = CGPDFPageGetBoxRect(page, kCGPDFMediaBox)
UIGraphicsBeginPDFPageWithInfo(pageFrame, nil)
var ctx = UIGraphicsGetCurrentContext()
// Draw existing page
CGContextSaveGState(ctx); …Run Code Online (Sandbox Code Playgroud) 我有一个绘图方法,但在调整UIGraphicsBeginImageContextWithOptions的比例因子时,绘图性能会受到很大影响.
当比例为1.0时,一切都工作得非常快,但是,当视网膜显示的比例因子为0.0,2.0或3.0时,在绘制时有很多滞后的表现很糟糕.
当视网膜设备使用0.0,2.0或3.0的比例因子时,可以修改什么来提高性能?
绘制缓慢,滞后:
UIGraphicsBeginImageContextWithOptions(self.view.frame.size, false, 0.0)
UIGraphicsBeginImageContextWithOptions(self.view.frame.size, false, 2.0)
UIGraphicsBeginImageContextWithOptions(self.view.frame.size, false, 3.0)
Run Code Online (Sandbox Code Playgroud)
画得快,没有滞后:
UIGraphicsBeginImageContextWithOptions(self.view.frame.size, false, 1.0)
Run Code Online (Sandbox Code Playgroud) 因此众所周知,苹果在unicode中支持表情符号的图像可以以高达160x160像素的分辨率提取.有一个工具可以在OS X上通过从"apple color emoji"字体中提取数据来执行此操作:https://github.com/tmm1/emoji-extractor
我有兴趣在iOS上以类似的方式提取/利用苹果的Emoji图像,我找到了以下解决方案,并且非常喜欢这里的实现:https://stackoverflow.com/a/38809531/4556704
extension String {
func image() -> UIImage {
let size = CGSize(width: 30, height: 35)
UIGraphicsBeginImageContextWithOptions(size, false, 0);
UIColor.whiteColor().set()
let rect = CGRect(origin: CGPointZero, size: size)
UIRectFill(CGRect(origin: CGPointZero, size: size))
(self as NSString).drawInRect(rect, withAttributes: [NSFontAttributeName: UIFont.systemFontOfSize(30)])
let image = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
return image
}
}
Run Code Online (Sandbox Code Playgroud)
但是,我遇到了一个问题,即我遇到了这个实现.如果我使用上面的字符串扩展名,我很明显结果图像的分辨率不是160x160像素.我的意思是,如果我要在项目的资产中包含一个160x160的图像,我无法生成质量相当的图像.
这是什么原因,如果不向我的项目导入超过1700个表情符号图像,我可以解决这个问题吗?我认为iOS上的字体仍然必须包含生成160x160图像样本所需的数据.String扩展是理想的,因为它允许我比我简单地导入所有这些图像更自由地引用表情符号字符.
我认为这可能需要一些低级代码,这可能比它的价值更麻烦,但我真的很想知道更多关于这个问题的根源和可能的修复.我确信这归因于苹果没有将表情符号渲染到高于必要水平的水平,但肯定有一些方法可以覆盖它.另外我知道还有其他高分辨率的表情符号图像集,这个问题与此无关.
编辑10/18/16:我得出结论,问题可归因于被采样的源图像不具有可能的最高分辨率.似乎表情符号没有以高于48x48像素的分辨率进行渲染,因为已经证明表情符号图像可以在OS X上渲染到160x160像素,并且可以从"Apple Color Emoji.ttf/.ttc"中删除"在160x160像素.我不确定是否有可能解决这个问题,因为它似乎是iOS使用unicode字符代码映射到png图像数据的强硬限制.
我正在使用在主线程上执行的跟随代码来截取屏幕截图(不是self.view的子视图)视图然后显示在UIImageView.一切都在功能方面运行良好,但是因为这个代码是在扩展上运行的,所以存在更严格的内存界限(我读过~30 MB是上限?),
UIGraphicsBeginImageContextWithOptions(CGSizeMake(self.screenshotView.frame.size.width, self.screenshotView.frame.size.height-2), YES, 0.0f);
CGContextRef context = UIGraphicsGetCurrentContext();
[self.screenshotView.layer renderInContext:context];
_generatedImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
self.previewImageView.image = _generatedImage;
Run Code Online (Sandbox Code Playgroud)
performSelectorOnMainThread无论何时UIButton按下,都会调用此代码所在的方法.A UIAlertController也用于处理UI的冻结,但是如果连续按下按钮(在解除之后UIAlertController),前几次内存使用将保持在基线附近(~15 MB),但随后加速到~30 MB并保持在那里,直到几秒钟后再次调用该方法,然后当它完成渲染时,它会回落到~15 MB.
我不确定是什么导致了这种行为,为什么内存使用不会一直保持在~15 MB左右,而且我不确定当连续调用该方法时它会出现什么样的情况.听起来更像是有时会发生一件事吗?我怎样才能确保不会发生这种情况,只会在UIAlertController不使内存使用量增加的情况下解除再次渲染的安全性.
我正在使用擦除图像的功能,我的代码如下所示.你可以在这里看到 视频.这 current_sticker_img是我的Imageview
注意: 我也使用Pan Gesture缩放图像
//MARK: Eraser touch event
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
if btn_eraser.isSelected == true || btn_repaint.isSelected == true{
let touch : UITouch = touches.first!
lastpoint = touch.location(in: current_sticker_img)
}
}
override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {
if btn_eraser.isSelected == true || btn_repaint.isSelected == true{
let touch = touches.first!
let currentPoint : CGPoint = touch.location(in: current_sticker_img)
let isPointInsideView = current_sticker_img.point(inside: currentPoint, with: event)
if …Run Code Online (Sandbox Code Playgroud) ios ×9
swift ×7
objective-c ×2
sprite-kit ×2
uiimage ×2
blurry ×1
cgpoint ×1
drawing ×1
emoji ×1
erase ×1
memory ×1
rendering ×1
skview ×1
swift3 ×1
xamarin.ios ×1