我正在构建一个需要将UIImage转换为CGImageRef的Iphone应用程序.我不知道如何做到这一点,并希望得到一些帮助.我没有使用图像的背景...... :)
我正在尝试在CoreGraphics中处理图像,然后将处理后的图像返回到NSImage
保存和显示.我有足够的资源来介绍如何在iOS中执行这些功能,但是辅助方法似乎缺失了NSImage
.在iOS中,类方法是imageWithCGImage:
,如何在Mac OS中执行此操作?
我正在生成一堆瓷砖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图像?也许使用NEON
像libjpeg-turbo这样的ARM扩展(iPhone 3GS +)的库呢?
是否有比PNG更好的格式来保存不占用大量空间的瓷砖?
我能够提出的唯一可行选择是将磁贴大小增加到512 x 512.这会将编码时间减少一半.不知道那会对我的滚动视图做些什么.该应用适用于iPad 2+,仅支持iOS 6(使用iPhone 4S作为基线).
uiimage catiledlayer ios cgimageref uiimagepngrepresentation
在使用OpenCV时,我需要将NSImage转换为OpenCV多通道2D矩阵(cvMat),反之亦然.
最好的方法是什么?
迎接,
Dom
我正在编写这种方法来计算图像的平均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) 以下代码可以通过手动内存管理进行编译,但在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
更新到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) 我在从 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 会导致如此大量的堆增长?
谢谢
我正在尝试从屏幕缓冲区中读取像素,我正在创建一个CGImageRef
with CGDisplayCreateImage
,但是值的值CGImageGetWidth
和CGImageGetBytesPerRow
"没有意义"在一起,将每行的字节数除以每个像素的字节数给出了每行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) 假设你从一个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) cgimageref ×10
uiimage ×5
ios ×3
macos ×3
objective-c ×3
ciimage ×2
cocoa-touch ×2
nsimage ×2
calayer ×1
catiledlayer ×1
cgimage ×1
cocoa ×1
core-image ×1
framebuffer ×1
image ×1
iphone ×1
memory-leaks ×1
nsdata ×1
opencv ×1
xcode ×1