Я пытаюсь получить CIImage
из ImageView, который отображается на экране.
UIImage *image = myImageView.image;
преобразуйте изображение UIImage
в CIImage
.
CIImage *cImage = [....];
Как это сделать?
Я пытаюсь получить CIImage
из ImageView, который отображается на экране.
UIImage *image = myImageView.image;
преобразуйте изображение UIImage
в CIImage
.
CIImage *cImage = [....];
Как это сделать?
CIImage *ciImage = [UIImage imageNamed:@"test.png"].CIImage;
UIImage *uiImage = [[UIImage alloc] initWithCIImage:ciImage];
Чтобы исправить случай, когда myUIImage.CIImage
возвращает nil
например [UIImageView image]
, вместо этого вы можете сделать [CIImage imageWithCGImage:myUIImage.CGImage]
- Dylan Hand
Swift версия:
let ciImage = UIImage(named: "test.png")!.ciImage
let uiImage = UIImage(ciImage: ciImage)
Чтобы исправить случай, когда myUIImage.ciImage
возвращает nil
как вы можете вместо этого сделать CIImage(cgImage: myUIImage!.cgImage!)
.
В то время как ответ Changxing Wang действительно правильный, Apple говорит, что UIImage.CIImage не всегда будет работать. В частности, из PocketCoreImage:
// Create a CIImage from the _inputImage. While UIImage has a property returning
// a CIImage representation of it, there are cases where it will not work. This is the
// most compatible route.
_filteredImage = [[CIImage alloc] initWithCGImage:_inputImage.CGImage options:nil];
Apple также использует следующее, которое НЕ работает для меня:
[UIImage imageWithCIImage:_filteredImage]
Моя личная реализация, адаптированная из этого сообщения, работает для меня:
// result is a CIImage, output of my filtering.
// returnImage is (obviously) a UIImage that I'm going to return.
CIContext *context = [CIContext contextWithOptions:nil];
UIImage *returnImage =
[UIImage imageWithCGImage:[context createCGImage:result fromRect:result.extent]];
Это наиболее совместимый способ сделать это:
UIImage* u =[UIImage imageNamed:@"image.png"];
CIImage* ciimage = [[CIImage alloc] initWithCGImage:u.CGImage];
теперь используйте ciimage...
и Swift версия:
let i1 = UIImage(named: "testImage")
if let cgi1 = i1?.cgImage {
let ci = CIImage(cgImage: cgi1)
//use ci
}
(исправлена опечатка в операторе if let)
Вот полный образец кода, который я использовал в своих проектах.
- (UIImage *)makeUIImageFromCIImage:(CIImage *)ciImage {
CIContext *context = [CIContext contextWithOptions:nil];
CGImageRef cgImage = [context createCGImage:ciImage fromRect:[ciImage extent]];
UIImage* uiImage = [UIImage imageWithCGImage:cgImage];
CGImageRelease(cgImage);
return uiImage;
}
CIImage
- это в основном рецепт изображения. У вас возникнут проблемы, если вы попытаетесь напрямую конвертировать из CIImage
в UIImage
. Например, вызов
NSData * UIImageJPEGRepresentation (
UIImage *image,
CGFloat compressionQuality
);
вернется nil
.
func toCIImage(image: UIImage) -> CIImage {
return image.CIImage ?? CIImage(CGImage: image.CGImage!)
}
func toUIImage(image: CIImage) -> UIImage {
return UIImage(CIImage: image)
}
Пример Swift changx:
guard let ciimage = CIImage(image: uiimage) else { return }
let image = UIImage(CIImage: ciimage)
Свифт 3/4
UIImage> CIImage
let ciimage = CIImage(image: image)
https://developer.apple.com/documentation/uikit/uiimage/1624090-init
CIImage> UIImage
let image = UIImage(ciImage: ciimage)
https://developer.apple.com/documentation/coreimage/ciimage/1624119-init
При преобразовании UIImage в CIImage у меня было 2 отдельных случая, когда он иногда ноль, а иногда нет. Ниже код решил это:
CIImage *ciImage;
ciImage=[[CIImage alloc] initWithImage:imageToConvert];
if (ciImage==nil)
ciImage=imageToConvert.CIImage;