Objective c 如何在Xcode中使用图像转换过滤器?

Objective c 如何在Xcode中使用图像转换过滤器?,objective-c,ios,image-processing,core-image,Objective C,Ios,Image Processing,Core Image,在成功地跟踪了Ray Wenderlich网站上的一篇文章之后,我决定尝试并运用我学到的知识,并将其应用于CITransition,尤其是CIDissolveTransition。然而,即使在对照苹果自己的过滤器文档(我得说,这些文档都过时了,除了它们自己复杂的例子之外,很难适应),我也无法让图像出现。以下是我到目前为止的情况: NSURL *url = [NSURL fileURLWithPath:imagePath]; NSURL *url2 = [NSURL fileURLWithPath

在成功地跟踪了Ray Wenderlich网站上的一篇文章之后,我决定尝试并运用我学到的知识,并将其应用于CITransition,尤其是CIDissolveTransition。然而,即使在对照苹果自己的过滤器文档(我得说,这些文档都过时了,除了它们自己复杂的例子之外,很难适应),我也无法让图像出现。以下是我到目前为止的情况:

NSURL *url = [NSURL fileURLWithPath:imagePath];
NSURL *url2 = [NSURL fileURLWithPath:image2Path];
CIContext *context;
CIFilter *filter;
CIImage *beginImage, *targetImage;
UIImageView *mainImage = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 200, 200)];
[self addSubview:mainImage];

beginImage = [CIImage imageWithContentsOfURL:url];
targetImage = [CIImage imageWithContentsOfURL:url2];

if(context == nil)
{
  NSLog(@"Creating Context");
  context = [CIContext contextWithOptions:nil];
}
if(filter == nil) {
  NSLog(@"Creating filter");
  filter = [CIFilter filterWithName:@"CIDissolveTransition" keysAndValues:@"inputImage",   beginImage, @"inputTargetImage", targetImage, @"inputTime", [NSNumber numberWithFloat:0.5], nil];
}

CIImage *outputImage = [filter outputImage];

CGImageRef cgimg = [context createCGImage:outputImage fromRect:[outputImage extent]];
UIImage *newImg = [UIImage imageWithCGImage:cgimg];

[mainImage setImage:newImg];

我得到的只是一个黑屏,主图像应该显示在这个黑屏上。最终的目标是能够使用一个滑块(我只是假设它会起作用)循环通过一系列具有这种溶解效果的图像,但我甚至无法显示这个静态图像。任何帮助都将不胜感激。

您对filterWithName:keysAndValues:的调用将返回nil,因为iOS不知道如何创建CIDossolveTransition筛选器。 iOS核心映像不支持Mac OS核心映像所支持的所有过滤器。看


您可以阅读参考资料并查看iOS支持哪些过滤器,但坏消息是,过渡并没有在iOS 5中起到作用。iOS 5中处理合成的唯一可用过滤器是CISOURCEOVERCOMPITING,您可能对此不太感兴趣。

您对filterWithName:keysAndValues:的调用将返回nil,因为iOS不知道如何制作CIDossolveTransition过滤器。 iOS核心映像不支持Mac OS核心映像所支持的所有过滤器。看


您可以阅读参考资料并查看iOS支持哪些过滤器,但坏消息是,过渡并没有在iOS 5中起到作用。iOS 5中处理合成的唯一可用过滤器是CISOURCEOVERCOMPING,您可能对此不感兴趣。

正如Jay在回答中提到的,iOS不支持转换。但是,我找到并编辑了一个脚本,它获取两幅图像的像素值,并根据百分比返回两幅图像的交叉。方法如下:

- (UIImage*)morphImage:(UIImage*)img1
             withImage:(UIImage*)img2
             withValue:(float)val
{  
CGImageRef sourceImage = img1.CGImage;
CGImageRef sourceImage2 = img2.CGImage;

CFDataRef theData;
theData = CGDataProviderCopyData(CGImageGetDataProvider(sourceImage));
CFDataRef theData2;
theData2 = CGDataProviderCopyData(CGImageGetDataProvider(sourceImage2));

UInt8 *pixelData = (UInt8 *) CFDataGetBytePtr(theData);
UInt8 *pixelData2 = (UInt8 *) CFDataGetBytePtr(theData2);

int dataLength = CFDataGetLength(theData);

//color byte increments
int red = 0;
int green = 1;
int blue = 2;
//temporary rgb values for both images
int r1, g1, b1, r2, g2, b2;
//fake slider value
for (int index = 0; index < dataLength; index += 4) {
r1 = pixelData[index + red];
g1 = pixelData[index + green];
b1 = pixelData[index + blue];
r2 = pixelData2[index + red];
g2 = pixelData2[index + green];
b2 = pixelData2[index + blue];

pixelData[index + red] += (r2 - r1) * val;
pixelData[index + green] += (g2 - g1) * val;
pixelData[index + blue] += (b2 - b1) * val;
}

CGContextRef context;
context = CGBitmapContextCreate(pixelData,
                              CGImageGetWidth(sourceImage),
                              CGImageGetHeight(sourceImage),
                              8,
                              CGImageGetBytesPerRow(sourceImage),
                              CGImageGetColorSpace(sourceImage),
                              kCGImageAlphaPremultipliedLast);

CGImageRef newCGImage = CGBitmapContextCreateImage(context);
UIImage *newImage = [UIImage imageWithCGImage:newCGImage];

CGContextRelease(context);
CFRelease(theData);
CGImageRelease(newCGImage);

return newImage;
-(UIImage*)变形图像:(UIImage*)img1
withImage:(UIImage*)img2
withValue:(浮点)val
{  
CGImageRef sourceImage=img1.CGImage;
CGImageRef sourceImage2=img2.CGImage;
CFDataRef数据;
数据=CGDataProviderCopyData(CGImageGetDataProvider(sourceImage));
CFDataRef数据2;
数据2=CGDataProviderCopyData(CGImageGetDataProvider(sourceImage2));
UInt8*像素数据=(UInt8*)CFDataGetBytePtr(数据);
UInt8*像素数据2=(UInt8*)CFDataGetBytePtr(数据2);
int dataLength=CFDataGetLength(theData);
//颜色字节增量
红色整数=0;
绿色整数=1;
int蓝色=2;
//两幅图像的临时rgb值
int r1,g1,b1,r2,g2,b2;
//假滑块值
对于(int index=0;index
}


我还没有在设备上测试过它,但是当使用滑块在6到10个200x200图像之间循环时,它在模拟器上运行得非常平稳。我想,如果事先提取图像像素数据,效率会更高

正如Jay在回答中提到的,iOS不支持过渡。但是,我找到并编辑了一个脚本,它获取两幅图像的像素值,并根据百分比返回两幅图像的交叉。方法如下:

- (UIImage*)morphImage:(UIImage*)img1
             withImage:(UIImage*)img2
             withValue:(float)val
{  
CGImageRef sourceImage = img1.CGImage;
CGImageRef sourceImage2 = img2.CGImage;

CFDataRef theData;
theData = CGDataProviderCopyData(CGImageGetDataProvider(sourceImage));
CFDataRef theData2;
theData2 = CGDataProviderCopyData(CGImageGetDataProvider(sourceImage2));

UInt8 *pixelData = (UInt8 *) CFDataGetBytePtr(theData);
UInt8 *pixelData2 = (UInt8 *) CFDataGetBytePtr(theData2);

int dataLength = CFDataGetLength(theData);

//color byte increments
int red = 0;
int green = 1;
int blue = 2;
//temporary rgb values for both images
int r1, g1, b1, r2, g2, b2;
//fake slider value
for (int index = 0; index < dataLength; index += 4) {
r1 = pixelData[index + red];
g1 = pixelData[index + green];
b1 = pixelData[index + blue];
r2 = pixelData2[index + red];
g2 = pixelData2[index + green];
b2 = pixelData2[index + blue];

pixelData[index + red] += (r2 - r1) * val;
pixelData[index + green] += (g2 - g1) * val;
pixelData[index + blue] += (b2 - b1) * val;
}

CGContextRef context;
context = CGBitmapContextCreate(pixelData,
                              CGImageGetWidth(sourceImage),
                              CGImageGetHeight(sourceImage),
                              8,
                              CGImageGetBytesPerRow(sourceImage),
                              CGImageGetColorSpace(sourceImage),
                              kCGImageAlphaPremultipliedLast);

CGImageRef newCGImage = CGBitmapContextCreateImage(context);
UIImage *newImage = [UIImage imageWithCGImage:newCGImage];

CGContextRelease(context);
CFRelease(theData);
CGImageRelease(newCGImage);

return newImage;
-(UIImage*)变形图像:(UIImage*)img1
withImage:(UIImage*)img2
withValue:(浮点)val
{  
CGImageRef sourceImage=img1.CGImage;
CGImageRef sourceImage2=img2.CGImage;
CFDataRef数据;
数据=CGDataProviderCopyData(CGImageGetDataProvider(sourceImage));
CFDataRef数据2;
数据2=CGDataProviderCopyData(CGImageGetDataProvider(sourceImage2));
UInt8*像素数据=(UInt8*)CFDataGetBytePtr(数据);
UInt8*像素数据2=(UInt8*)CFDataGetBytePtr(数据2);
int dataLength=CFDataGetLength(theData);
//颜色字节增量
红色整数=0;
绿色整数=1;
int蓝色=2;
//两幅图像的临时rgb值
int r1,g1,b1,r2,g2,b2;
//假滑块值
对于(int index=0;index
}

我还没有在设备上测试过它,但它在上个月运行得很平稳