标签: cgimageref

UIImage - > CGImageRef

我正在构建一个需要将UIImage转换为CGImageRef的Iphone应用程序.我不知道如何做到这一点,并希望得到一些帮助.我没有使用图像的背景...... :)

cocoa-touch image uiimage cgimageref

45
推荐指数
2
解决办法
3万
查看次数

从CGImageRef获取NSImage

我正在尝试在CoreGraphics中处理图像,然后将处理后的图像返回到NSImage保存和显示.我有足够的资源来介绍如何在iOS中执行这些功能,但是辅助方法似乎缺失了NSImage.在iOS中,类方法是imageWithCGImage:,如何在Mac OS中执行此操作?

macos core-graphics nsimage cgimageref

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

有什么方法可以比UIImagePNGRepresentation更快地编码PNG?

我正在生成一堆瓷砖CATiledLayer.在iPhone 4S上以4个级别的细节生成120个256 x 256的图块需要大约11秒钟.图像本身适合2048 x 2048.

我的瓶颈是UIImagePNGRepresentation.生成每256 x 256图像大约需要0.10-0.15秒.

我已经尝试在不同的背景队列上生成多个图块,但这只会将其减少到大约9-10秒.

我也尝试使用ImageIO框架,代码如下:

- (void)writeCGImage:(CGImageRef)image toURL:(NSURL*)url andOptions:(CFDictionaryRef) options
{
    CGImageDestinationRef myImageDest = CGImageDestinationCreateWithURL((__bridge CFURLRef)url, (__bridge CFStringRef)@"public.png", 1, nil);
    CGImageDestinationAddImage(myImageDest, image, options);
    CGImageDestinationFinalize(myImageDest);
    CFRelease(myImageDest);
}
Run Code Online (Sandbox Code Playgroud)

虽然这会产生较小的PNG文件(赢!),但它需要大约13秒,比以前多2秒.

有没有办法CGImage更快地编码PNG图像?也许使用NEONlibjpeg-turbo这样的ARM扩展(iPhone 3GS +)的库呢?

是否有比PNG更好的格式来保存不占用大量空间的瓷砖?

我能够提出的唯一可行选择是将磁贴大小增加到512 x 512.这会将编码时间减少一半.不知道那会对我的滚动视图做些什么.该应用适用于iPad 2+,仅支持iOS 6(使用iPhone 4S作为基线).

uiimage catiledlayer ios cgimageref uiimagepngrepresentation

13
推荐指数
1
解决办法
1941
查看次数

NSImage到cv :: Mat,反之亦然

在使用OpenCV时,我需要将NSImage转换为OpenCV多通道2D矩阵(cvMat),反之亦然.

最好的方法是什么?

迎接,
Dom

macos opencv nsimage cgimage cgimageref

10
推荐指数
1
解决办法
5848
查看次数

如何在iOS中发布CGImageRef

我正在编写这种方法来计算图像的平均R,G,B值.以下方法将UIImage作为输入,并返回包含输入图像的R,G,B值的数组.我有一个问题:如何/我在哪里正确发布CGImageRef?

-(NSArray *)getAverageRGBValuesFromImage:(UIImage *)image
{
    CGImageRef rawImageRef = [image CGImage];

    //This function returns the raw pixel values
    const UInt8 *rawPixelData = CFDataGetBytePtr(CGDataProviderCopyData(CGImageGetDataProvider(rawImageRef)));

    NSUInteger imageHeight = CGImageGetHeight(rawImageRef);
    NSUInteger imageWidth = CGImageGetWidth(rawImageRef);

    //Here I sort the R,G,B, values and get the average over the whole image
    int i = 0;
    unsigned int red = 0;
    unsigned int green = 0;
    unsigned int blue = 0;

    for (int column = 0; column< imageWidth; column++)
    {
        int r_temp = 0;
        int g_temp = 0; …
Run Code Online (Sandbox Code Playgroud)

memory-leaks memory-management ios cgimageref

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

在ARC上将CALayer的内容设置为iOS上的CGImageRef

以下代码可以通过手动内存管理进行编译,但在ARC下失败:

CALayer *layer = [CALayer layer];
layer.contents = [[UIImage imageNamed:@"dial.png"] CGImage];
Run Code Online (Sandbox Code Playgroud)

错误是:

自动引用计数问题:ARC不允许将非Objective-C指针类型'CGImageRef'(又名'struct CGImage*')隐式转换为'id'

如何使用ARC运行?

cocoa-touch objective-c calayer cgimageref automatic-ref-counting

8
推荐指数
1
解决办法
5361
查看次数

在控制台中获取消息:对于支持数据提供者的CGImageRef,"CreateWrappedSurface()失败."

更新到Xcode 7并在操作中呈现图像时获取此(警告?)消息:

对于支持数据提供者的CGImageRef,CreateWrappedSurface()失败.

在Xcode 6.4下没有这样的消息.

得到了哪个代码部分抛出了消息:

if (!self.originalImage) // @property (nonatomic, strong) UIImage *originalImage;
        return;

CGImageRef originalCGImage = self.originalImage.CGImage;
NSAssert(originalCGImage, @"Cannot get CGImage from original image");
CIImage *inputCoreImage = [CIImage imageWithCGImage:originalCGImage]; // this results the console message
Run Code Online (Sandbox Code Playgroud)

我替换了我的CIIImage创建者直接从UIImage获取它:

CIImage *originalCIImage = self.originalImage.CIImage;
NSAssert(originalCIImage, @"Cannot build CIImage from original image");
Run Code Online (Sandbox Code Playgroud)

在这种情况下,我没有得到任何控制台消息,但有一个断言:originalCIImage是零.

UIImage的类引用说:

@property(nonatomic,readonly)CIImage*CIImage

如果使用CGImageRef初始化UIImage对象,则属性的值为nil.

所以我使用原始代码作为后备:

CIImage *originalCIImage = self.originalImage.CIImage;
if (!originalCIImage) {
    CGImageRef originalCGImageRef = self.originalImage.CGImage;
    NSAssert(originalCGImageRef, @"Unable to get CGimageRef of originalImage");
    originalCIImage = [CIImage imageWithCGImage:originalCGImageRef];
}
NSAssert(originalCIImage, @"Cannot …
Run Code Online (Sandbox Code Playgroud)

xcode objective-c uiimage cgimageref ciimage

7
推荐指数
1
解决办法
2953
查看次数

从 CIImage 获取 UIImage 无法正常工作

我在从 CIImage 获取 UIImage 时遇到问题。下面的代码行在 iOS6 上工作正常:(输出图像是 CIImage)

self.imageView = [UIImage imageWithCIImage:outputImage];
Run Code Online (Sandbox Code Playgroud)

或者

[self.imageView setImage:[UIImage imageWithCIImage:outputImage]];
Run Code Online (Sandbox Code Playgroud)

当我在运行 iOS 5 的设备上运行同一行代码时,imageView 为空白。如果我记录 UIImage 的 size 属性,它是正确的,但图像永远不会显示在屏幕上。

当我使用 CGImageRef(如下所示)时,它在两个设备上都可以正常工作,但是当我进行堆快照分析时,它会导致巨大的内存增长。

context = [CIContext contextWithOptions:nil];
CGImageRef ref = [context createCGImage:outputImage fromRect:outputImage.extent];
self.imageView.image = [UIImage imageWithCGImage:ref scale:1.0 orientation:UIImageOrientationUp];
CGImageRelease(ref);
Run Code Online (Sandbox Code Playgroud)

有谁知道为什么 UIImage imageWithCIImage 不起作用?根据 UIImage 类参考,它应该适用于 iOS5 及更高版本。另外为什么使用 CGImageRef 会导致如此大量的堆增长?

谢谢

iphone core-image uiimage cgimageref ciimage

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

CGImageRef宽度与每行字节数不一致

我正在尝试从屏幕缓冲区中读取像素,我正在创建一个CGImageRefwith CGDisplayCreateImage,但是值的值CGImageGetWidthCGImageGetBytesPerRow"没有意义"在一起,将每行的字节数除以每个像素的字节数给出了每行1376个像素,但是图像的宽度是1366.

这里发生了什么?图像中是否有某种填充?如何安全地读取数据,并获得正确的结果?

编辑:重现此操作所需的最小代码如下:

#import <Foundation/Foundation.h>
#import <ApplicationServices/ApplicationServices.h>

int main(int argc, const char * argv[])
{

    @autoreleasepool {
        CGImageRef image = CGDisplayCreateImage(CGMainDisplayID());

        size_t width = CGImageGetWidth(image);
        size_t bpr = CGImageGetBytesPerRow(image);
        size_t bpp = CGImageGetBitsPerPixel(image);
        size_t bpc = CGImageGetBitsPerComponent(image);
        size_t bytes_per_pixel = bpp / bpc;

        NSLog(@"%li %li", bpr/bytes_per_pixel, width);

        CGImageRelease(image);

    }
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

macos cocoa framebuffer cgimageref

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

如何将从CGImageRef创建的UIImage对象转换为原始数据并再次返回

假设你从一个UIImage开始,你想要裁剪它.最常见的方法是使用CGImageCreateWithImageInRect来获取CGImageRef并从中创建一个新图像,如下所示:

CGRect cropRect = CGRectMake(x*width, y*height, width, height);
CGImageRef imageRef = CGImageCreateWithImageInRect([image CGImage], cropRect);
UIImage *croppedImage = [UIImage imageWithCGImage:imageRef];
Run Code Online (Sandbox Code Playgroud)

现在让我们说你以后需要将这个UIImage转换为NSData对象.例如,如果您希望使用NSKeyedArchiver将映像存储在磁盘上,则会发生这种情况.或者,您可以通过以下显式执行以下操作来获取NSData对象:

NSData *imageData = UIImagePNGRepresentation(croppedImage);
Run Code Online (Sandbox Code Playgroud)

我做了这个,后来我尝试通过以下方式重建一个新的UIImage对象:

UIImage *image = [UIImage imageWithData:imageData];
Run Code Online (Sandbox Code Playgroud)

我为一系列48张图片做了这个.他们中的大多数都很好,但是在每4张图片之后,接下来的两张图片都被破坏了,每张图片的顶部和底部都被交换了.如果我将转换转换为NSData并再次返回,它可以正常工作.如果我使用NSKeyedArchiver将图像数组写入磁盘(我猜它在其编码例程中调用类似UIImagePNGRepresentation的东西),我也会得到完全相同的问题.我的理论是这必须与我如何从CGImageRefs构建图像有关.

这是什么解决方法?我似乎无法弄清楚如何将CGImageRefs放入NSData对象,我更喜欢一个正确构建UIImage的解决方案,以便它可以被序列化.

编辑:

有些人要求运行实际的代码,所以我在这里添加它

    UIImage *image = self.animationObject.image;
for (int y=0; y<[self.animationInfoObject.numInY intValue]; y++) {
    for (int x=0; x<[self.animationInfoObject.numInX intValue]; x++) {
        CGRect cropRect = CGRectMake(x*width, y*height, width, height);
        CGImageRef imageRef = CGImageCreateWithImageInRect([image CGImage], cropRect);
        UIImage *croppedImage = [UIImage imageWithCGImage:imageRef];
        NSData *imageData = UIImageJPEGRepresentation(croppedImage, 1.0);
        [self addImageToArray:imageData];
        CFRelease(imageRef);
    }
} …
Run Code Online (Sandbox Code Playgroud)

objective-c uiimage nsdata ios cgimageref

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