标签: cgimage

如何确定和解释CGImage的像素格式

我使用以下方法加载此(非常小)的图像:

UIImage* image = [UIImage named:@"someFile.png"];
Run Code Online (Sandbox Code Playgroud)

图像为4x1,按顺序从左到右包含红色,绿色,蓝色和白色像素.

接下来,我从底层CGImage中获取像素数据:

NSData* data = (NSData*)CGDataProviderCopyData(CGImageGetDataProvider(image.CGImage));
Run Code Online (Sandbox Code Playgroud)

现在,出于某种原因,像素数据的布局取决于iOS设备.

当我在模拟器或iPhone 4上运行应用程序时,像素数据如下所示:

(255,0,0),(0,255,0),(0,0,255),(255,255,255)

因此,像素为每像素3个字节,蓝色为最高有效字节,红色为最低有效字节.所以我想你称之为BGR?

当我检查CGBitmapInfo时,我可以看到kCGBitmapByteOrderMask是kCGBitmapByteOrderDefault.我无法找到解释"默认"的地方.

另一方面,当我在我的第一代iPhone上运行时,像素数据如下所示:

(0,0,255,255),(0,255,0,255),(255,0,0,255),(255255255255)

因此每个通道4个字节,alpha作为最重要的字节,蓝色作为最不重要的字节.所以......这叫做ARGB?

我一直在查看CGBitmapInfo,了解如何检测布局的线索.在第一代iPhone上,kCGBitmapAlphaInfoMask是kCGImageAlphaNoneSkipFirst.这意味着忽略了最重要的位.这是有道理的.在第一代iPhone上,kCGBitmapByteOrderMask是kCGBitmapByteOrder32Little.我不知道这意味着什么或如何将它与R,G和B组件如何在内存中布局相关联.任何人都可以对此有所了解吗?

谢谢.

iphone pixels quartz-graphics cgimage ios

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

CGImageCreate中的颜色失真

我正在尝试为我的iOS应用程序构建一个图像捕获,但我的CGImage结果不断变色.这是相机预览,正确的颜色.

在此输入图像描述

可乐是红色的,一切都很好.

当我运行快照代码时,我得到了这个:

在此输入图像描述

可乐是蓝色的......这是从哪里来的?

我试着弄乱了一些参数,但最终却没有得到任何图像.这是我的快照代码:

int bitsPerComponent = 8;
    int bitsPerPixel = 32;
    int bytesPerRow = [cameraVideo bufRowBytes];
    CGDataProviderRef provider = CGDataProviderCreateWithData(NULL, [cameraVideo bufDataPtr], [cameraVideo bufWidth]*[cameraVideo bufHeight]*4, NULL);

    CGColorSpaceRef colorSpaceRef = CGColorSpaceCreateDeviceRGB();
    CGBitmapInfo bitmapInfo = kCGImageAlphaNoneSkipLast;
    CGColorRenderingIntent renderingIntent = kCGRenderingIntentPerceptual;

    CGImageRef imageRef = CGImageCreate( [cameraVideo bufWidth], [cameraVideo bufHeight], bitsPerComponent, bitsPerPixel,
                                        bytesPerRow, colorSpaceRef, bitmapInfo, provider, NULL, NO, renderingIntent);

    CGColorSpaceRelease(colorSpaceRef);
Run Code Online (Sandbox Code Playgroud)

我在我的智慧结束,所以如果有人能看到我做错了什么,请告诉我.

固定

这是最终的代码:

if (cameraVideo.ARPixelFormat == kCVPixelFormatType_32ARGB) {
    bitmapInfo = kCGBitmapByteOrder32Big | kCGImageAlphaNoneSkipFirst;
} else {
    bitmapInfo = kCGBitmapByteOrder32Little | kCGImageAlphaNoneSkipFirst;
}
Run Code Online (Sandbox Code Playgroud)

iphone camera image objective-c cgimage

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

UIImage的CGImage返回NULL

我创建了一个将图像分割成多个图像的函数,但是当我拿到UIImage的CGImage时,CGImage返回NULL

NSArray* splitImage(UIImage* image,NSUInteger pieces) {

NSLog(@"width: %f, %zu",image.size.width,CGImageGetWidth(image.CGImage));
NSLog(@"%@",image.CGImage);
returns NULL
NSMutableArray* tempArray = [[NSMutableArray alloc]initWithCapacity:pieces];

CGFloat piecesSize = image.size.height/pieces;

for (NSUInteger i = 0; i < pieces; i++) {

    // take in account retina displays
    CGRect subFrame = CGRectMake(0,i * piecesSize * image.scale ,image.size.width * image.scale,piecesSize * image.scale);

    CGImageRef newImage = CGImageCreateWithImageInRect(image.CGImage,subFrame);

    UIImage* finalImage =[UIImage imageWithCGImage:newImage];

    CGImageRelease(newImage);

    [tempArray addObject:finalImage];

}

NSArray* finalArray = [NSArray arrayWithArray:tempArray];

[tempArray release];

return finalArray;



}
Run Code Online (Sandbox Code Playgroud)

objective-c uiimage cgimage ios

7
推荐指数
2
解决办法
5561
查看次数

CGContextClear警告

我在使用CGImageDestinationFinalize时遇到iOS问题.我将在CGImageDestinationRef上调用CGImageDestinationFinalize,我会收到以下警告

错误:函数`CGContextClear'已过时,将在即将发布的更新中删除.不幸的是,这个应用程序或它使用的库正在使用这个过时的功能,从而导致系统性能的整体下降.

看看乐器,当我调用CGImageDestinationFinalize时,我的内存使用率会上升(有时它会变得太高而崩溃).我不确定这个问题是否应该受到指责,但我已将其与CGImageDestinationFinalize的问题分开了

有关使用什么来避免调用CGContextClear的任何建议?或者如何使用CGImageDestinationFinalize减少内存使用量?

cgimage ios

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

适用于iOS的图像分割

我需要一种方法将包含人类的图像转换为仅包含一种颜色的身体sihlouette的图像.首先我看一下Canny边缘检测器(OpenCV实现),但这可能会导致图像背景出现问题.

我尝试过使用GrabCut OpenCV实现.这在大多数情况下工作正常,它具有非常糟糕的时间性能,例如对于480x320图像,处理需要1分钟.此外,抓取的问题是用户需要进行交互并设置背景区域和用户区域,在我的情况下是不允许的.

所以,也许你可以使用与GrabCut不同的东西给我一些关于另一种方法的想法,或者建议我如何增强GrabBut时间性能(也许是gpu实现).此外,我需要一个关于将定位人体的算法的建议,并帮助抓取算法与身体/背景区域的定位.

例:

例

objective-c uiimage cgimage ios

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

无法编辑屏幕截图,performChanges阻止失败

我正在开发一个允许用户使用PhotoKit编辑照片的应用程序.我之前将编辑过的照片以JPEG格式保存到磁盘.我想避免转换为JPEG,并已实施修改,以便这样做.它适用于使用相机拍摄的照片,但如果您尝试编辑屏幕截图,则该PHPhotoLibrary.sharedPhotoLibrary().performChanges块将失败并记录The operation couldn’t be completed. (Cocoa error -1.).我不确定为什么这会导致performChanges块失败,我在这里做错了什么?

我已经创建了一个可供下载示例应用程序来演示问题,我已经在下面提供了相关代码.该应用会尝试编辑照片库中的最新照片.如果成功,它将提示访问以编辑照片,否则不会发生任何事情,您将看到控制台日志.要重现此问题,请截取屏幕截图然后运行该应用.

当前使用屏幕截图的代码:

let jpegData: NSData = outputPhoto.jpegRepresentationWithCompressionQuality(0.9)

let contentEditingOutput = PHContentEditingOutput(contentEditingInput: self.input)

var error: NSError?
let success = jpegData.writeToURL(contentEditingOutput.renderedContentURL, options: NSDataWritingOptions.AtomicWrite, error: &error)
if success {
    return contentEditingOutput
} else {
    return nil
}
Run Code Online (Sandbox Code Playgroud)

导致屏幕截图失败的替换代码:

let url = self.input.fullSizeImageURL
let orientation = self.input.fullSizeImageOrientation
var inputImage = CIImage(contentsOfURL: url)
inputImage = inputImage.imageByApplyingOrientation(orientation)

let outputPhoto = createOutputImageFromInputImage(inputImage)!

let originalImageData = NSData(contentsOfURL: self.input.fullSizeImageURL)!
let imageSource = CGImageSourceCreateWithData(originalImageData, …
Run Code Online (Sandbox Code Playgroud)

cgimage nsdata ios ios8 photokit

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

ScreenCaptureKit/CVPixelBuffer 格式会产生意想不到的结果

我有一个使用 ScreenCaptureKit 的项目。由于超出问题范围的各种原因,我配置 ScreenCaptureKit 使用的格式是kCVPixelFormatType_32BGRA——我需要原始 BGRA 数据,稍后会对其进行操作。

当我从数据构造一个CGImage或时,显示和一些窗口看起来很好(完整的代码包含在问题的底部 - 这只是转换的摘录)。NSImage

guard let cvPixelBuffer = sampleBuffer.imageBuffer else { return }
CVPixelBufferLockBaseAddress(cvPixelBuffer, .readOnly)
defer { CVPixelBufferUnlockBaseAddress(cvPixelBuffer, .readOnly) }
let vImageBuffer: vImage_Buffer = vImage_Buffer(data: CVPixelBufferGetBaseAddress(cvPixelBuffer),
                                                        height: vImagePixelCount(CVPixelBufferGetHeight(cvPixelBuffer)),
                                                        width: vImagePixelCount(CVPixelBufferGetWidth(cvPixelBuffer)),
                                                        rowBytes: CVPixelBufferGetWidth(cvPixelBuffer) * 4)
        
let cgImageFormat: vImage_CGImageFormat = vImage_CGImageFormat(
                    bitsPerComponent: 8,
                    bitsPerPixel: 32,
                    colorSpace: CGColorSpaceCreateDeviceRGB(),
                    bitmapInfo: CGBitmapInfo(rawValue: CGImageAlphaInfo.last.rawValue),
                    renderingIntent: .defaultIntent
                )!
if let cgImage: CGImage = try? vImageBuffer.createCGImage(format: cgImageFormat) {
  let nsImage = NSImage(cgImage: cgImage, …
Run Code Online (Sandbox Code Playgroud)

cgimage swift cvpixelbuffer screencapturekit

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

如何从磁盘上的图像制作CGImageRef

我到处寻找无济于事.我正在线程中进行一些图像加载,因为UIKit不是线程安全的,我将不得不将图像存储为CGImageRefs,但我无法弄清楚如何做到这一点.我之前没有使用任何Quartz的东西,所以这让我很困惑.基本上我只需要将磁盘中的JPG加载到CGImageRef中.同样对于奖励积分,无论如何将GIF加载到CGImageRef中?

iphone jpeg gif quartz-graphics cgimage

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

iPad(非常)简单的绘图

我正在尝试在我的应用程序中实现一个非常简单的绘图视图.这只是我的应用程序的一小部分,但它变成了一个真正的麻烦.这是我到目前为止所拥有的,但它现在正在显示的是莫尔斯代码,如点和线.

  - (void)viewDidLoad {
        [super viewDidLoad];
    self.view.backgroundColor = [UIColor whiteColor];
    NSArray* paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,
                                                         NSUserDomainMask, YES);
    NSString *docsPath = [paths objectAtIndex:0];

    NSString *savePath  = [NSString stringWithFormat:@"%@/notePadImage.jpg",docsPath];

    NSData *data = [NSData dataWithContentsOfFile:savePath];

    UIImage *image = [UIImage imageWithData:data];

    if (image == nil) {
        NSString *pathToBlank = [[NSBundle mainBundle]pathForResource:@"blankNotePadPage" ofType:@"png"];
        NSData *data = [NSData dataWithContentsOfFile:pathToBlank];
        image = [UIImage imageWithData:data];
    }
    arrayOfTouches = [[NSMutableArray alloc] initWithCapacity:10];
    self.drawImage.image = image;

    mouseMoved = 0;
    [self.view bringSubviewToFront:closeButton];
    [self.view bringSubviewToFront:clearButton];
    self.timer = [NSTimer scheduledTimerWithTimeInterval:.02 target:self selector:@selector(drawIt) userInfo:nil repeats:YES]; …
Run Code Online (Sandbox Code Playgroud)

iphone draw cgimage ipad

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

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
查看次数