iOS9 的 Core Image 中的“需要一个 swizzler 以便可以读取 RGB8”是什么意思?

2024-02-03

首先,我想了一个解决办法,但这不是一个好办法。我会在最后给出。

当我处理 Filter In 时iOS9我收到“需要一个 swizzler 以便可以读取 RGB8”错误消息,并且通过此方法返回的图像是全黑的

[self.context createCGImage:self.outputImage fromRect:[self.outputImage extent]];

在这里

 - (UIImage *)fliterImage:(UIImage *)input flitername:(NSString *)name
{
    NSString * fliter_name = name;
    self.context = [CIContext contextWithOptions:nil]; 
    UIImage *image;
    if ([fliter_name isEqualToString:@"OriginImage"]){
        image = input;
    }else {

        self.ciImage = [[CIImage alloc] initWithImage:input];
        self.filter = [CIFilter filterWithName:fliter_name keysAndValues:kCIInputImageKey,self.ciImage, nil];
        [self.filter setDefaults];
        self.outputImage = [self.filter outputImage];
        // here give the error message
        self.cgimage = [self.context createCGImage:self.outputImage fromRect:[self.outputImage extent]];

        UIImage *image1 = [UIImage imageWithCGImage:self.cgimage];
        CGImageRelease(self.cgimage);

        self.context = [CIContext contextWithOptions:nil];
        //
        // self.filter=[CIFilter filterWithName:@"CIColorControls"];
        // _imageView.image=image;
        //
        //[self.filter setValue:[CIImage imageWithCGImage:image.CGImage] forKey:@"inputImage"];
        image = image1;
    }
    return image;
}

和婴儿车input是用我导演写的这个方法创建的

-(UIImage *)UIImageFromBmp:(uint8_t**)pixels withPlanesCount:(uint32_t)planeCount
{
    uint8_t *rgb = malloc(sizeof(uint8_t)*1920*1080*3);
    int step = 1920 * 3;
    // CSU: YUV420 has 2 kinds of data structure
    //      planeCount==3 --> |yyyyyyyy|
    //                        |yyyyyyyy|
    //                        |uuuu|
    //                        |vvvv|
    //      planeCount==2 --> |yyyyyyyy|
    //                        |yyyyyyyy|
    //                        |uvuvuvuv|
    if (planeCount == 3) {
        for (int rows=0; rows<1080; rows++) {
            for (int cols=0; cols<1920; cols++) {
                int y = pixels[0][rows*1920 + cols];
                int u = pixels[1][(rows>>1)*960 + (cols>>1)];
                int v = pixels[2][(rows>>1)*960 + (cols>>1)];
                int r = (int)((y&0xff) + 1.402*((v&0xff)-128));
                int g = (int)((y&0xff) - 0.34414*((u&0xff)-128) - 0.71414*((v&0xff)-128));
                int b = (int)((y&0xff) + 1.772*((u&0xff)-128));
                rgb[rows*step + cols*3 + 0] = MAX(MIN(r, 255), 0);
                rgb[rows*step + cols*3 + 1] = MAX(MIN(g, 255), 0);
                rgb[rows*step + cols*3 + 2] = MAX(MIN(b, 255), 0);
            }
        }
    } else if(planeCount == 2) {
        for (int rows=0; rows<1080; rows++) {
            for (int cols=0; cols<1920; cols++) {
                int y = pixels[0][rows*1920 + cols];
                int u = pixels[1][(rows>>1)*1920 + ((cols>>1)<<1)];
                int v = pixels[1][(rows>>1)*1920 + ((cols>>1)<<1)+1];
                int r = (int)((y&0xff) + 1.402*((v&0xff)-128));
                int g = (int)((y&0xff) - 0.34414*((u&0xff)-128) - 0.71414*((v&0xff)-128));
                int b = (int)((y&0xff) + 1.772*((u&0xff)-128));
                rgb[rows*step + cols*3 + 0] = MAX(MIN(r, 255), 0);
                rgb[rows*step + cols*3 + 1] = MAX(MIN(g, 255), 0);
                rgb[rows*step + cols*3 + 2] = MAX(MIN(b, 255), 0);
            }
        }
    } else {
        // CSU: should not happen
        assert(0);
    }

    NSData *data = [NSData dataWithBytes:rgb length:step*1080];
    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();

    CGDataProviderRef provider = CGDataProviderCreateWithCFData((__bridge CFDataRef)data);

    // CSU: Creating CGImage from raw data
    CGImageRef imageRef = CGImageCreate(1920,                                       //width
                                        1080,                                       //height
                                        8,                                          //bits per component
                                        8 * 3,                                      //bits per pixel
                                        step,                                       //bytesPerRow
                                        colorSpace,                                 //colorspace
                                        kCGImageAlphaNone|kCGBitmapByteOrderDefault,// bitmap info
                                        provider,                                   //CGDataProviderRef
                                        NULL,                                       //decode
                                        false,                                      //should interpolate
                                        kCGRenderingIntentDefault                   //intent
                                        );


    // CSU: Getting UIImage from CGImage
    UIImage *finalImage = [UIImage imageWithCGImage:imageRef];
    CGImageRelease(imageRef);
    CGDataProviderRelease(provider);
    CGColorSpaceRelease(colorSpace);

    free(rgb);

    return finalImage;
}

我用谷歌搜索一下,并意识到图像格式可能会导致问题。 所以我打电话[self clipImageWithScaleWithsize:_scaledImage.size input:_sourceImage];在图像传递到之前处理图像

[self.context createCGImage:self.outputImage fromRect:[self.outputImage extent]];与此(尺寸只是图像尺寸)

- (UIImage *)clipImageWithScaleWithsize:(CGSize)asize input:(UIImage *)input
{
    UIImage *newimage;
    UIImage *image = input;
    if (nil == image) {
        newimage = nil;
    }
    else{
        CGSize oldsize = image.size;
        CGRect rect;
        if (asize.width/asize.height > oldsize.width/oldsize.height) {
            rect.size.width = asize.width;
            rect.size.height = asize.width*oldsize.height/oldsize.width;
            rect.origin.x = 0;
            rect.origin.y = (asize.height - rect.size.height)/2;
        }
        else{
            rect.size.width = asize.height*oldsize.width/oldsize.height;
            rect.size.height = asize.height;
            rect.origin.x = (asize.width - rect.size.width)/2;
            rect.origin.y = 0;
        }
        UIGraphicsBeginImageContext(asize);
        CGContextRef context = UIGraphicsGetCurrentContext();
        CGContextClipToRect(context, CGRectMake(0, 0, asize.width, asize.height));
        CGContextSetFillColorWithColor(context, [[UIColor clearColor] CGColor]);
        UIRectFill(CGRectMake(0, 0, asize.width, asize.height));//clear background
        [image drawInRect:rect];
        newimage = UIGraphicsGetImageFromCurrentImageContext();
        UIGraphicsEndImageContext();
    }
    return newimage;
}

它确实解决了问题,但我仍然感到困惑,而且我认为这不是一个好方法。 “需要一个 swizzler 以便可以读取 RGB8”到底是什么意思,以及为什么我的解决方案有效?


None

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

iOS9 的 Core Image 中的“需要一个 swizzler 以便可以读取 RGB8”是什么意思? 的相关文章

  • 在完成块中保留循环

    在我的课堂上 我创建了这个方法 void refreshDatasourceWithSuccess CreateDataSourceSuccessBlock successBlock failure CreateDataSourceFail
  • 将 C 转换为 Swift:向 UITextField 添加放大镜图标

    如何在左侧添加一个放大镜图标UITextField 我找到了类似问题的答案here https stackoverflow com questions 11811705 where can i get the magnifying glas
  • iOS 自定义滑块删除两端的最小和最大空间

    我正在尝试使用自定义滑块 class MySlider UISlider override func trackRect forBounds bounds CGRect gt CGRect let customBounds CGRect o
  • mgwt - 以编程方式改变方向

    是否可以在 gwt mgwt 应用程序中更改强制执行特定的屏幕方向 可以说我希望用户始终以横向模式使用应用程序 这取决于 是作为phonegap应用程序 而不是在浏览器内部 如果您作为 Web 应用程序运行 则不需要t get any co
  • Admob 广告无法快速显示

    您好 我正在尝试将 admob 广告添加到已使用 swift 上传到应用商店的应用程序中 我在 admob 中制作了一个应用程序并复制了 appid 和广告 id 并显示了各自的横幅广告和插页式广告 这里的问题是当我写这行时 request
  • 无法从 iOS 中的框架访问 .nib(XIB) 文件

    我已经从现有的代码库中创建了一个框架 并尝试在新的代码库中使用它 这很好用 但是当我尝试访问属于我的框架包的一部分的 nib 文件时 我的应用程序崩溃了 这是我用来访问视图控制器 XIB 文件的代码 testViewController c
  • UITableView:显示 tableFooterView 时运行代码?

    我正在使用 UIView表页脚视图 http developer apple com library ios documentation uikit reference UITableView Class Reference Referen
  • .showsPhysics 内存泄漏

    我最近花了 5 个小时尝试调试 Spritekit 应用程序中的内存泄漏 应用程序启动后 我注意到内存使用量略有上升 我花了 5 个小时中的 3 个小时挖掘参考资料 了解强与弱的关系ARC https developer apple com
  • Swift SpriteKit edgeLoopF​​romRect 问题

    下面的代码可以识别底部和顶部边缘场景和球按预期弹开 但是 那左边缘和右边缘现场的情况一直被破坏 如果施加足够的力 球会离开屏幕 然后最终返回 就好像场景的边缘超出了 iPhone 模拟器窗口的边缘 import SpriteKit clas
  • 将自定义数据包含到 iOS 故障转储中

    你好 堆栈溢出 有一个简单的问题要问您 当我的应用程序在用户的设备上崩溃时 是否可以将自定义错误数据嵌入到自动生成的 iOS 故障转储中 例如 我的 SQlite 数据库由于某种原因无法运行 例如 数据库文件已损坏 我无法从这个错误中恢复
  • Objective-C UILabel 作为超链接

    我正在尝试做一个UILabel一个链接UIWebView 我怎样才能做一个UILabel作为超链接 您可以使用 UITapGestureRecognizer 它将实现与您想要的类似的功能 UILabel myLabel UILabel al
  • 从一个模态视图无缝翻转到另一个模态视图,而不显示纯色背景

    我的 iPad 应用程序的 UI 如下 当我点击Settings按钮 我希望对话框水平翻转以显示设置对话框 我这个工作正常 但是 当对话翻转时会显示背景颜色 如你看到的 有什么办法可以让对话框翻转时不显示该颜色块吗 我希望它看起来更加无缝
  • (Kiss)XML xpath 和默认命名空间

    我正在开发一个 iPhone 项目 需要解析一些 xml xml 可能包含也可能不包含默认名称空间 我需要知道如何解析 xml 以防它使用默认命名空间 由于我需要读取和写入 xml 因此我倾向于使用 KissXML 但我愿意接受建议 这是我
  • 为什么 iOS 启动屏幕很慢?

    我的 iOS 应用程序启动屏幕大约需要 3 5 秒 我有一张将在启动屏幕后加载的地图 我的用户必须等待启动屏幕加载 然后再等待 3 秒才能加载地图 有没有办法最大限度地减少启动屏幕时间 基本上这种延迟意味着you在启动过程中做了一些非常错误
  • 调整 UIImage 的大小而不将其完全加载到内存中?

    我正在开发一个应用程序 用户可以在其中尝试加载非常非常大的图像 这些图像首先在表格视图中显示为缩略图 我的原始代码会在大图像上崩溃 因此我重写它以首先将图像直接下载到磁盘 是否有一种已知的方法可以调整磁盘上图像的大小 而无需通过以下方式将其
  • 在实例化对象之前是否可以检查故事板中是否存在标识符?

    在我的代码中我有这一行 但我想知道是否有办法检查是否 一些控制器 在我将它与 一起使用之前就存在实例化ViewControllerWithIdentifier 方法 如果标识符不存在 则应用程序崩溃 如果没有好的方法 这并不是一个大问题 我
  • 叠加 SKScene 未显示

    我正在尝试将 SKScene 覆盖在 SCNScene 上 当我在模拟器和 iPhone6 上运行我的应用程序时 overlayScene SKScene 按预期显示 但是当我尝试在 iPhone5 上运行它 尝试了 2 个不同的设备 时
  • 模态转场需要点击 2 次而不是 1 次

    我的 UITableView 需要点击 2 次才能显示所选单元格的详细信息页面 一次用于选择 另一次用于显示详细信息视图 我希望有一个 CLI 直接显示所单击单元格的详细视图 我在 UITableViewManager m 中使用此方法的模
  • ios - 如何声明静态变量? [复制]

    这个问题在这里已经有答案了 C 中声明的静态变量如下 private const string Host http 80dfgf7c22634nbbfb82339d46 cloudapp net private const string S
  • 隐藏选项卡栏项目并对齐其他选项卡项目

    在我的应用程序中 我有 4 个选项卡栏项目 我正在 XIB 文件中添加这 4 个选项卡栏项目 最初我必须显示 3 个选项卡栏项目 同步后我必须在我的应用程序中显示第 4 个选项卡栏项目 因此 为此 我使用以下代码隐藏第四个选项卡栏项目 se

随机推荐