标签: cgimage

将缩略图添加/传递(exif)到CGImageDestinationRef

CGImageDestinationRef Apple的参考文献中,它提到It can contain thumbnail images as well as properties for each image.具有属性的部分很好,通过properties在添加图像时设置参数CGImageDestinationRef,但我无法弄清楚如何添加缩略图.

我想添加一个缩略图(或直接从a传递CGImageSourceRef)CGImageDestinationRef,这样当打开结果图像时,CGImageSourceRef我可以使用它CGImageSourceCreateThumbnailAtIndex来检索原始缩略图.

NSDictionary* thumbOpts = [NSDictionary dictionaryWithObjectsAndKeys:
                                       (id)kCFBooleanTrue, (id)kCGImageSourceCreateThumbnailWithTransform,
                                       (id)kCFBooleanFalse, (id)kCGImageSourceCreateThumbnailFromImageIfAbsent,
                                       [NSNumber numberWithInt:128], (id)kCGImageSourceThumbnailMaxPixelSize, 
                                       nil];
CGImageRef thumb = CGImageSourceCreateThumbnailAtIndex(iSource, 0, (CFDictionaryRef)thumbOpts);
Run Code Online (Sandbox Code Playgroud)

上面的代码返回存储它的图像的缩略图,但是当我通过图像时CGImageDestinationRef,缩略图会丢失.

有没有办法保留原始缩略图(或创建一个新缩略图)?CGImageProperties Reference似乎没有任何键来存储缩略图.

cocoa exif objective-c cgimage

6
推荐指数
1
解决办法
723
查看次数

UIImage正在发布但CGImage尚未发布

当我创建UIFmage实例时,我似乎有一个内存管理问题,CGImages没有被释放.

我有一个分页UIScrollView来滚动浏览一系列JPG图像.下面是我的整个类,它是分页滚动视图中的页面视图.

代码正在主线程上运行.该代码使用ARC.我尝试使用imageWithContentsOfFile加载图像:(返回一个自动释放的对象)以及initWithContentsOfFile :(返回一个保留的对象).我已经尝试了@autoreleasepool并使用performSelectorOnMainThread来确保代码在主线程上运行,如其他帖子中所建议的那样.

在滚动图像时,内存使用量会一直增长,直到应用程序终止,如图所示.注意图像io的高分配.

屏幕截图显示虚拟内存使

虚拟内存跟踪器

在下面的屏幕截图中,可以看到GTGImageScrollerPageViews,UIImageViews和UIImages正在被释放.请注意,高300中的这些编号有Transitory对象.然而,CGImages没有被发布,CGImages生活的数量在高400和0 Transitory.

显示分配的屏幕截图

分配

编辑:以前我一直在回收和重新使用ScrollView中的GTGImageScrollerPageView实例,这是像这样的滚动视图的常见模式.为了简化尝试调试此问题的时间,我允许在ScrollView中显示整个GTGImageScrollerPageView后取消分配.正如您在上面的第二张图片中看到的那样,只有4个GTGImageScrollerPageView生活和377瞬态,还有388个UIImageViews和389个UIIMages列为暂时的,因此看起来UIImageViews和UIImages正在被释放.

如果我用CGImageRelease手动释放CGImage(在下面的代码中注释掉),CGImages将被释放.我知道我不应该这样做,因为我不拥有CGImage,但这有助于验证这是问题发生的地方.下面的屏幕截图显示了在仪器中测试的相同代码,但CGImageRelease未注释.

屏幕截图显示了使用CGImageRelease的虚拟内存使用情况

虚拟内存使用

屏幕截图显示了使用CGImageRelease的分配

在此输入图像描述

在使用CGImageRelease的分析输出中,您可以看到正确数量的CGImage对象是Living和Transitory,并且内存不会无限增长.此外,在使用CGImageRelease时,应用程序不会崩溃.

如果这是CGImage的一些系统缓存,那么它应该在引发内存警告时释放内存,但事实并非如此.记忆力继续增长.

这可能导致内存无限增长?

这是页面视图的代码

编辑:作为对评论的回应,我更新了代码以进一步简化,从而消除了诸如ivars和不需要证明问题所需的属性的干扰.问题保持不变,分析时结果相同.我还在NSLog中添加了也输出线程.我确实看到在GTGImageScrollerPageView上按预期调用了dealloc,它始终是线程#1,并且对displayAspectThumbImage的调用始终在线程#1上.

我真的不相信这里提供的代码有任何问题,Rob的慷慨努力证实了这一点.还有其他因素造成这种情况,但是加载和显示图像的所有代码都在这里; 这里没有其他有效的代码.我能想到的另一个值得注意的事情是,从滚动视图委托的scrollViewDidScroll和scrollViewDidEndDecellerating方法调用displayAspectThumbImage方法,但是在主线程上调用方法的事实应该排除由于在另一个线程上运行而导致的自动释放问题.

我已经检查过并且NSZombies没有启用,并且没有僵尸增加我的内存使用量.实际上,当调用CGImageRelease方法时,内存使用非常平坦,如上面的屏幕截图所示.

@implementation GTGImageScrollerPageView

- (void)dealloc {

    NSLog(@"%s %@", __PRETTY_FUNCTION__, [NSThread currentThread]);

 }


  - (void)displayAspectThumbImage:(NSString *)path {

      NSLog(@"%s %@", __PRETTY_FUNCTION__, [NSThread currentThread]);

      UIImageView *imageView = [[UIImageView alloc] initWithFrame:self.bounds];
      [self addSubview:imageView];

      UIImage *image = [[UIImage alloc] initWithContentsOfFile:path];
      [imageView setImage:image];

      //If uncommented CGImages are disposed correctly
      //CGImageRelease([imageView.image CGImage]);

}


@end
Run Code Online (Sandbox Code Playgroud)

测试:

iOS 6.1.4

iOS 5.0.1

memory-management cgimage ios

6
推荐指数
1
解决办法
1800
查看次数

IOS:屏蔽保持视网膜比例因子的图像

我想通过传递另一个图像作为掩码来掩盖图像.我能够掩盖图像,但生成的图像看起来不太好.它在边界处是锯齿状的.

我猜这个问题与视网膜图形有关.两个图像的比例属性不同:

  1. 我要屏蔽的图像具有比例值1.此图像的分辨率通常大于1000x1000像素.
  2. 我希望得到的图像(仅具有黑白颜色的图像)的图像具有比例值2.该图像通常具有300×300像素的分辨率.

生成的图像的比例值为1.

我使用的代码是:

+ (UIImage*) maskImage:(UIImage *)image withMask:(UIImage *)maskImage {

CGImageRef maskRef = maskImage.CGImage;

CGImageRef mask = CGImageMaskCreate(CGImageGetWidth(maskRef),
                                    CGImageGetHeight(maskRef),
                                    CGImageGetBitsPerComponent(maskRef),
                                    CGImageGetBitsPerPixel(maskRef),
                                    CGImageGetBytesPerRow(maskRef),
                                    CGImageGetDataProvider(maskRef), NULL, false);


CGImageRef masked = CGImageCreateWithMask([image CGImage], mask);
CGImageRelease(mask);
UIImage *maskedImage = [UIImage imageWithCGImage:masked ];
CGImageRelease(masked);
return maskedImage;
}
Run Code Online (Sandbox Code Playgroud)

如何获得跟随视网膜尺度的蒙面图像?

core-graphics uiimage cgimage ios

6
推荐指数
2
解决办法
1619
查看次数

使用AVFoundation混合图像和视频

我正在尝试将图像拼接成预先存在的视频,以便在Mac上使用AVFoundation创建新的视频文件.

到目前为止,我已经阅读了Apple文档示例,

ASSETWriterInput用于在Iphone问题上从UIImages制作视频

使用AVVideoCompositionCoreAnimationTool在CALayer中将视频与静态图像混合

AVFoundation教程:为视频和其他一些SO链接添加叠加和动画

现在这些已经被证明是非常有用的,但我的问题是我没有创建一个静态水印或覆盖,我想在视频的各个部分之间插入图像.到目前为止,我已经设法获取视频并创建空白部分以插入这些图像并将其导出.

我的问题是让图像在这些空白部分插入自己.我可以看到可行的唯一方法是创建一系列动画层,以便在正确的时间改变它们的不透明度,但我似乎无法让动画工作.

下面的代码是我用来创建视频片段和图层动画的代码.

    //https://developer.apple.com/library/ios/documentation/AudioVideo/Conceptual/AVFoundationPG/Articles/03_Editing.html#//apple_ref/doc/uid/TP40010188-CH8-SW7

    // let's start by making our video composition
    AVMutableComposition* mutableComposition = [AVMutableComposition composition];
    AVMutableCompositionTrack* mutableCompositionTrack = [mutableComposition addMutableTrackWithMediaType:AVMediaTypeVideo preferredTrackID:kCMPersistentTrackID_Invalid];

    AVMutableVideoComposition* mutableVideoComposition = [AVMutableVideoComposition videoCompositionWithPropertiesOfAsset:gVideoAsset];

    // if the first point's frame doesn't start on 0
    if (gFrames[0].startTime.value != 0)
    {
        DebugLog("Inserting vid at 0");
        // then add the video track to the composition track with a time range from 0 to the first point's startTime
        [mutableCompositionTrack insertTimeRange:CMTimeRangeMake(kCMTimeZero, gFrames[0].startTime) ofTrack:gVideoTrack atTime:kCMTimeZero …
Run Code Online (Sandbox Code Playgroud)

macos avfoundation cgimage caanimation ios

6
推荐指数
1
解决办法
3238
查看次数

Swift:在没有TabBar和NavigationBar的情况下裁剪屏幕截图

我有整个屏幕的截图screenshot,使用以下内容生成:

let layer = UIApplication.sharedApplication().keyWindow!.layer
let scale = UIScreen.mainScreen().scale
UIGraphicsBeginImageContextWithOptions(layer.frame.size, false, scale);

layer.renderInContext(UIGraphicsGetCurrentContext())
let screenshot = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
Run Code Online (Sandbox Code Playgroud)

我想裁剪它,以便不包括标签栏,我尝试使用以下代码:

let crop = CGRectMake(0, 0, //"start" at the upper-left corner
self.view.bounds.width, //include half the width of the whole screen
self.view.bounds.height + self.navigationController!.navigationBar.frame.height) //include the height of the navigationBar and the height of view

let cgImage = CGImageCreateWithImageInRect(screenshot.CGImage, crop)
let image: UIImage = UIImage(CGImage: cgImage)!
Run Code Online (Sandbox Code Playgroud)

此代码image仅显示屏幕的一小部分,从屏幕左上角开始的矩形(0,0),向右延伸不到屏幕宽度的一半,然后向下不到一半屏幕的高度.不过,我想要包括整个屏幕,除了标签栏占用的区域.有没有这种方法来裁剪它?

screenshot cgimage ios uigraphicscontext swift

6
推荐指数
1
解决办法
3836
查看次数

IOS:模糊使用init(CGImage)

我想把一个转换CGImage成一个CIImage; 但它没有用.

这行代码:

let personciImage = CIImage(CGImage: imageView.image!.CGImage!)
Run Code Online (Sandbox Code Playgroud)

抛出以下错误

模糊地使用'init(CGImage)'

我真的很困惑这个错误意味着什么.

我需要做这个转换,因为CIDetector.featuresInImage()从内置CoreImage框架需要一个CIImage

cgimage ciimage swift

6
推荐指数
1
解决办法
3725
查看次数

如何使用RGB数据创建CGImage?

谁能告诉我一个如何使用的明确例子

CGImageRef CGImageCreate 
(
   size_t width,
   size_t height,
   size_t bitsPerComponent,
   size_t bitsPerPixel,
   size_t bytesPerRow,
   CGColorSpaceRef colorspace,
   CGBitmapInfo bitmapInfo,
   CGDataProviderRef provider,
   const CGFloat decode[],
   bool shouldInterpolate,
   CGColorRenderingIntent intent
);
Run Code Online (Sandbox Code Playgroud)

我有一个CGFloat dataBuffer [width*height*3];

它包含图像的所有RGB数据.基本上,它从像素R(0,0),G(0,0),B(0,0),R(0,1)...到R(宽度,高度),G(宽度,高度) ,B(宽度,高度)

我知道图像的大小,宽x高.我如何使用我拥有的信息并创建CGImage?

请帮忙,谢谢

我发布了另一个包含上述问题的问题.nschmidt正确回答,这是链接

在Objective-C++ Cocoa中将RGB数据转换为位图

cocoa objective-c cgimage ios

5
推荐指数
1
解决办法
1万
查看次数

修剪UIImage边框

这是我想修剪的图像的一个例子.我想摆脱图像周围的边框(在这种情况下是顶部和底部黑条).

UIImage修剪

我在Github上找到了一个库:CKImageAdditions,但它似乎不起作用.当我传入UIColor(RGB颜色)时,它只返回相同的图像.

我可以找到许多示例和类别类来修剪UIImage,任何透明像素作为边框,但在这种情况下我需要修剪黑色.我已经对我的图像中的颜色进行了采样,它们的颜色值确实是255,但它似乎与上面的库所寻找的不匹配.

有没有人有他们使用的图书馆或任何见解?我搜索和搜索了CKImageAdditions,这是我唯一可以找到广告用颜色修剪的东西(虽然不幸的是在我的情况下不起作用).

c objective-c uiimage cgimage ios

5
推荐指数
1
解决办法
1378
查看次数

将CIImage转换为CGImage太慢了

我需要将a转换CIImage为a CGImage.这是我目前使用的代码:

CGImageRef img = [myContext createCGImage:ciImage fromRect:[ciImage extent]];
Run Code Online (Sandbox Code Playgroud)

但是对于具有常规尺寸的图像,他的代码行非常慢.很慢,我可以正确使用它.是否有另一种来将这些转换更快的方法CIImagesCGImages

最后我Core Graphics用来画CGImages一个CGContext.如果有一种方法可以直接绘制CIImagesCGContext我认为也应该更快.这可能吗?

谢谢

xcode core-graphics cgimage ios ciimage

5
推荐指数
1
解决办法
5749
查看次数

比较IOS中两个图像的RGB

在我的应用程序中,我需要比较两个图像的RGB是否相同.我正在使用此代码...

-(CGFloat)compareImage:(UIImage *)imgPre capturedImage:(UIImage *)imgCaptured
{    

int colorDiff;
CFDataRef pixelData = CGDataProviderCopyData(CGImageGetDataProvider(imgPre.CGImage));
int myWidth = (int )CGImageGetWidth(imgPre.CGImage)/2;
int myHeight =(int )CGImageGetHeight(imgPre.CGImage)/2;
const UInt8 *pixels = CFDataGetBytePtr(pixelData);

int bytesPerPixel_ = 4;
int pixelStartIndex = (myWidth + myHeight) * bytesPerPixel_;
UInt8 alphaVal = pixels[pixelStartIndex];
UInt8 redVal = pixels[pixelStartIndex + 1];
UInt8 greenVal = pixels[pixelStartIndex + 2];
UInt8 blueVal = pixels[pixelStartIndex + 3];
UIColor *color = [UIColor colorWithRed:(redVal/255.0f) green:(greenVal/255.0f) blue:(blueVal/255.0f) alpha:(alphaVal/255.0f)];
NSLog(@"color of image=%@",color);
NSLog(@"color of R=%hhu/G=%hhu/B=%hhu",redVal,greenVal,blueVal);


CFDataRef pixelDataCaptured = CGDataProviderCopyData(CGImageGetDataProvider(imgCaptured.CGImage));
int myWidthCaptured …
Run Code Online (Sandbox Code Playgroud)

rgb objective-c cgimage ios

5
推荐指数
1
解决办法
405
查看次数