标签: cgimage

将图像转换为灰度

我试图通过以下方式将图像转换为灰度:

#define bytesPerPixel 4
#define bitsPerComponent 8

-(unsigned char*) getBytesForImage: (UIImage*)pImage
{
    CGImageRef image = [pImage CGImage];
    NSUInteger width = CGImageGetWidth(image);
    NSUInteger height = CGImageGetHeight(image);

    NSUInteger bytesPerRow = bytesPerPixel * width;

    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
    unsigned char *rawData = malloc(height * width * 4);
    CGContextRef context = CGBitmapContextCreate(rawData, width, height, bitsPerComponent, bytesPerRow, colorSpace, kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big);
    CGColorSpaceRelease(colorSpace);

    CGContextDrawImage(context, CGRectMake(0, 0, width, height), image);
    CGContextRelease(context);

    return rawData;
}

-(UIImage*) processImage: (UIImage*)pImage
{   
    DebugLog(@"processing image");
    unsigned char *rawData = [self getBytesForImage: pImage]; …
Run Code Online (Sandbox Code Playgroud)

iphone cocoa-touch cgimage

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

将CGImageRef保存到png文件?

在我的Cocoa应用程序中,我从磁盘加载一个.jpg文件,操纵它.现在需要将其作为.png文件写入磁盘.你怎么能这样做?

谢谢你的帮助!

cocoa png core-graphics cgimage

29
推荐指数
4
解决办法
3万
查看次数

iPhone:更改CGImage的CGImageAlphaInfo

我有一个PNG图像具有不受支持的位图图形上下文像素格式.每当我尝试调整图像大小时,都会CGBitmapContextCreate()以不支持的格式进行扼流

我收到以下错误(格式错误,以方便阅读):

CGBitmapContextCreate: unsupported parameter combination: 
    8 integer bits/component; 
    32 bits/pixel; 
    3-component colorspace; 
    kCGImageAlphaLast; 
    1344 bytes/row.
Run Code Online (Sandbox Code Playgroud)

支持的像素格式列表绝对不支持这种组合.看来我需要重绘图像并将alpha通道信息移动到kCGImageAlphaPremultipliedFirst或kCGImageAlphaPremultipliedLast.

我不知道该怎么做.

PNG文件没有任何异常,并且没有损坏.它在所有其他环境中工作得很好.我偶然遇到这个错误,但显然我的用户可能有类似格式的文件,所以我必须检查我的应用程序的导入图像并纠正这个问题.

iphone png alpha cgimage cgbitmapcontextcreate

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

使用CGImageDestinationFinalize创建一个大型GIF - 内存不足

我正在尝试在创建包含大量帧的GIF时修复性能问题.例如,某些GIF可能包含> 1200帧.使用我当前的代码,我的内存不足.我正在试图弄清楚如何解决这个问题; 这可以分批完成吗?我的第一个想法是,是否可以将图像附加在一起,但我认为没有一种方法可以用于ImageIO框架创建GIF或如何创建GIF .如果有一个复数CGImageDestinationAddImages方法但没有,那将是很好的,所以我迷失了如何尝试解决这个问题.我感谢任何提供的帮助.对于冗长的代码提前抱歉,但我觉得有必要逐步创建GIF.

只要视频中可能存在不同的GIF帧延迟,并且录制时间与每帧中所有动画的总和不一样,我就可以制作视频文件而不是GIF.

注意:跳转到下面的最新更新标题以跳过背景故事.

更新1 - 6:使用固定的线程锁定GCD,但内存问题仍然存在.这里不需要100%的CPU利用率,因为我展示了一段UIActivityIndicatorView时间的工作.使用该drawViewHierarchyInRect方法可能比renderInContext方法更有效/更快,但是我发现您不能drawViewHierarchyInRect在后台线程上使用该方法,并将afterScreenUpdates属性设置为YES; 它锁定了线程.

必须有一些方法可以分批编写GIF.我相信我已经将内存问题缩小到:CGImageDestinationFinalize这种方法对于制作具有大量帧的图像来说效率非常低,因为所有内容都必须在内存中写出整个图像.我已经证实了这一点,因为我在抓取渲染的containerView图层图像和调用时使用了很少的内存CGImageDestinationAddImage.我打电话CGImageDestinationFinalize给记忆仪的那一刻立即飙升; 有时最高可达2GB,具体取决于帧数.所需的内存量似乎很疯狂,可以制作~20-1000KB的GIF.

更新2:我发现有一种方法可能会带来一些希望.它是:

CGImageDestinationCopyImageSource(CGImageDestinationRef idst, 
CGImageSourceRef isrc, CFDictionaryRef options,CFErrorRef* err) 
Run Code Online (Sandbox Code Playgroud)

我的新想法是,对于每10帧或其他任意帧数,我会将它们写入目的地,然后在下一个循环中,先前完成的10帧目标将成为我的新源.但是有一个问题; 阅读文档,它说明了这一点:

Losslessly copies the contents of the image source, 'isrc', to the * destination, 'idst'. 
The image data will not be modified. No other images should be added to the image destination. 
* CGImageDestinationFinalize() should not be …
Run Code Online (Sandbox Code Playgroud)

core-graphics objective-c gif cgimage ios

25
推荐指数
2
解决办法
4518
查看次数

在iOS上缩小图像的内存效率最高的方法是什么?

在后台线程中,我的应用程序需要从磁盘读取图像,将它们缩小到屏幕大小(1024x768或2048x1536)并将它们保存回磁盘.原始图像主要来自相机胶卷,但其中一些可能具有较大的尺寸(例如3000x3000).

稍后,在不同的线程中,这些图像将经常缩小到500x500左右的不同大小并再次保存到磁盘.

这让我想知道:在iOS,性能和内存方面,最有效的方法是什么?我使用了两种不同的API:

两者都适合我,但我想知道他们在性能和内存使用方面是否有任何差异.如果有更好的选择,当然.

memory-management core-graphics cgimage ios javax.imageio

22
推荐指数
3
解决办法
5158
查看次数

用户照片的相机叠加未保存为已编辑

我正在使用带有剪切的透明图像,以便用户插入/拍摄自己的图像.出于某种原因,在使用UIImagePickerControllerEditedImage和裁剪用户拍摄的照片时,图像不会像编辑时那样保存; 比如看照片.

我的问题是图像没有准确保存照片的编辑方式.(即:裁剪/调整大小).

设置UIImagePicker

-(void)choosePhotoDialog:(id)sender
{        
    OverlayView * overlay = [[OverlayView alloc] initWithFrame:CGRectMake(0, 0, SCREEN_WIDTH_IPHONE, SCREEN_HEIGTH_IPHONE) andPhoto:[dict objectForKey:@"imageUrl"]];
    [overlay setUserInteractionEnabled: NO];

    UIImagePickerController * picker = [[UIImagePickerController alloc] init];
    [picker setSourceType: UIImagePickerControllerSourceTypeCamera];
    [picker setDelegate: self];
    [picker setAllowsImageEditing: YES];
    [picker setShowsCameraControls: YES];
    [picker setNavigationBarHidden: YES];
    [picker setWantsFullScreenLayout: YES];
    [picker setCameraOverlayView: overlay];
    [self presentModalViewController:picker animated:YES];  
    [picker release];
}
Run Code Online (Sandbox Code Playgroud)

编辑图像后:

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info
{
    SDWebImageManager * manager = [SDWebImageManager sharedManager];
    UIImage * cachedImage  = [manager imageWithURL: [NSURL URLWithString: …
Run Code Online (Sandbox Code Playgroud)

uiimagepickercontroller uiimage cgimage ios camera-overlay

21
推荐指数
1
解决办法
2119
查看次数

Swift中的CGImageRelease

在Objc中,我CGImageRelease在处理图像后使用方法.但在Swift中,这种方法不可用.

关于Apple文档之后Retaining and Releasing Images有一个2 Objective-C symbols hidden

我的问题是,为什么CGImageReleaseSwift中没有更多?我们要调用另一种方法来取代它吗?

谢谢 !

cgimage ios swift

20
推荐指数
1
解决办法
6411
查看次数

从CIImage获取CGImage

我有一个从CIImage加载的UIImage:

tempImage = [UIImage imageWithCIImage:ciImage];

问题是我需要裁剪tempImage到一个特定的CGRect,我知道如何做到这一点的唯一方法是使用CGImage.问题是在iOS 6.0文档中我发现了这个:

CGImage
If the UIImage object was initialized using a CIImage object, the value of the property is NULL.

A.如何从CIImage转换为CGImage?我正在使用此代码,但我有内存泄漏(并且无法理解在哪里):

+(UIImage*)UIImageFromCIImage:(CIImage*)ciImage {  
    CGSize size = ciImage.extent.size;  
    UIGraphicsBeginImageContext(size);  
    CGRect rect;  
    rect.origin = CGPointZero;  
    rect.size   = size;  
    UIImage *remImage = [UIImage imageWithCIImage:ciImage];  
    [remImage drawInRect:rect];  
    UIImage *result = UIGraphicsGetImageFromCurrentImageContext();  
    UIGraphicsEndImageContext();  
    remImage = nil;  
    ciImage = nil;  
    //
    return result;  
}
Run Code Online (Sandbox Code Playgroud)

core-graphics core-image cgimage ios ciimage

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

如何在Swift中从CGImage创建UIImage?

我正在尝试UIImage从该ALAssetsGroup#posterImage方法创建一个.在Objective-C中,我可以简单地调用[UIImage imageWithCGImage:group.posterImage]但在Swift中,UIImage(CGImage: group.posterImage)给我一个编译器错误:

Could not find an overload for 'init' that accepts the supplied arguments
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?

core-foundation uiimage cgimage swift

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

在swift中从UIImage/CGImage获取像素数据作为数组

到目前为止,我有一个应用程序允许用户在UIImageView元素上自由绘制(如草图板).

我想将原始RGB像素数据(作为0到255整数值)作为多维数组获取,因此我可以将其提供给机器学习算法.或者是否有其他方法可以将原始图像数据发送到单独的C++函数?

在Swift中有一个简单的方法吗?

uiimage cgimage ios swift

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