我试图通过以下方式将图像转换为灰度:
#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) 在我的Cocoa应用程序中,我从磁盘加载一个.jpg文件,操纵它.现在需要将其作为.png文件写入磁盘.你怎么能这样做?
谢谢你的帮助!
我有一个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文件没有任何异常,并且没有损坏.它在所有其他环境中工作得很好.我偶然遇到这个错误,但显然我的用户可能有类似格式的文件,所以我必须检查我的应用程序的导入图像并纠正这个问题.
我正在尝试在创建包含大量帧的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) 在后台线程中,我的应用程序需要从磁盘读取图像,将它们缩小到屏幕大小(1024x768或2048x1536)并将它们保存回磁盘.原始图像主要来自相机胶卷,但其中一些可能具有较大的尺寸(例如3000x3000).
稍后,在不同的线程中,这些图像将经常缩小到500x500左右的不同大小并再次保存到磁盘.
这让我想知道:在iOS,性能和内存方面,最有效的方法是什么?我使用了两种不同的API:
CGImageSource和CGImageSourceCreateThumbnailAtIndex从ImageIO;CGBitmapContext并将结果保存到磁盘CGImageDestination.两者都适合我,但我想知道他们在性能和内存使用方面是否有任何差异.如果有更好的选择,当然.
我正在使用带有剪切的透明图像,以便用户插入/拍摄自己的图像.出于某种原因,在使用UIImagePickerControllerEditedImage和裁剪用户拍摄的照片时,图像不会像编辑时那样保存; 比如看照片.
我的问题是图像没有准确保存照片的编辑方式.(即:裁剪/调整大小).
-(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) 在Objc中,我CGImageRelease在处理图像后使用方法.但在Swift中,这种方法不可用.
关于Apple文档之后Retaining and Releasing Images有一个2 Objective-C symbols hidden
我的问题是,为什么CGImageReleaseSwift中没有更多?我们要调用另一种方法来取代它吗?
谢谢 !
我有一个从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) 我正在尝试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)
我究竟做错了什么?
到目前为止,我有一个应用程序允许用户在UIImageView元素上自由绘制(如草图板).
我想将原始RGB像素数据(作为0到255整数值)作为多维数组获取,因此我可以将其提供给机器学习算法.或者是否有其他方法可以将原始图像数据发送到单独的C++函数?
在Swift中有一个简单的方法吗?
cgimage ×10
ios ×6
swift ×3
uiimage ×3
iphone ×2
png ×2
alpha ×1
ciimage ×1
cocoa ×1
cocoa-touch ×1
core-image ×1
gif ×1
objective-c ×1