Dan*_*ena 5 image-processing uiimage ios
我需要从另一个UIImage(不是灰度)获得纯黑白UIImage.有人可以帮帮我吗?
谢谢阅读.
编辑:
这是建议的解决方案.谢谢大家.几乎我知道这不是更好的方法,它工作正常.
// Gets an pure black and white image from an original image.
- (UIImage *)pureBlackAndWhiteImage:(UIImage *)image {
unsigned char *dataBitmap = [self bitmapFromImage:image];
for (int i = 0; i < image.size.width * image.size.height * 4; i += 4) {
if ((dataBitmap[i + 1] + dataBitmap[i + 2] + dataBitmap[i + 3]) < (255 * 3 / 2)) {
dataBitmap[i + 1] = 0;
dataBitmap[i + 2] = 0;
dataBitmap[i + 3] = 0;
} else {
dataBitmap[i + 1] = 255;
dataBitmap[i + 2] = 255;
dataBitmap[i + 3] = 255;
}
}
image = [self imageWithBits:dataBitmap withSize:image.size];
return image;
}
Run Code Online (Sandbox Code Playgroud)
编辑1:
在回应评论时,这是方法bitmapFromImage和imageWithBits.
// Retrieves the bits from the context once the image has been drawn.
- (unsigned char *)bitmapFromImage:(UIImage *)image {
// Creates a bitmap from the given image.
CGContextRef contex = CreateARGBBitmapContext(image.size);
if (contex == NULL) {
return NULL;
}
CGRect rect = CGRectMake(0.0f, 0.0f, image.size.width, image.size.height);
CGContextDrawImage(contex, rect, image.CGImage);
unsigned char *data = CGBitmapContextGetData(contex);
CGContextRelease(contex);
return data;
}
// Fills an image with bits.
- (UIImage *)imageWithBits:(unsigned char *)bits withSize:(CGSize)size {
// Creates a color space
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
if (colorSpace == NULL) {
fprintf(stderr, "Error allocating color space\n");
free(bits);
return nil;
}
CGContextRef context = CGBitmapContextCreate (bits, size.width, size.height, 8, size.width * 4, colorSpace, kCGImageAlphaPremultipliedFirst);
if (context == NULL) {
fprintf (stderr, "Error. Context not created\n");
free (bits);
CGColorSpaceRelease(colorSpace );
return nil;
}
CGColorSpaceRelease(colorSpace );
CGImageRef ref = CGBitmapContextCreateImage(context);
free(CGBitmapContextGetData(context));
CGContextRelease(context);
UIImage *img = [UIImage imageWithCGImage:ref];
CFRelease(ref);
return img;
}
Run Code Online (Sandbox Code Playgroud)
此代码可能有所帮助:
for (int i = 0; i < image.size.width * image.size.height * 4; i += 4) {
if (dataBitmap[i + 0] >= dataBitmap[i + 1] && dataBitmap[i + 0] >= dataBitmap[i + 2]){
dataBitmap[i + 1] = dataBitmap[i + 0];
dataBitmap[i + 2] = dataBitmap[i + 0];
}
else if (dataBitmap[i + 1] >= dataBitmap[i + 0] && dataBitmap[i + 1] >= dataBitmap[i + 2]) {
dataBitmap[i + 0] = dataBitmap[i + 1];
dataBitmap[i + 2] = dataBitmap[i + 1];
}
else {
dataBitmap[i + 0] = dataBitmap[i + 2];
dataBitmap[i + 1] = dataBitmap[i + 2];
}
}
Run Code Online (Sandbox Code Playgroud)
小智 6
使用 Swift 3,我能够通过使用 CIFilters 来实现这种效果,首先通过应用CIPhotoEffectNoir(使其成为灰度)然后应用CIColorControl过滤器并将kCIInputContrastKey输入参数设置为高值(即 50)。设置该kCIInputBrightnessKey参数还将调整黑白对比度出现的强度,负值表示较暗的图像,正值表示较亮的图像。例如:
extension UIImage {
func toBlackAndWhite() -> UIImage? {
guard let ciImage = CIImage(image: self) else {
return nil
}
guard let grayImage = CIFilter(name: "CIPhotoEffectNoir", withInputParameters: [kCIInputImageKey: ciImage])?.outputImage else {
return nil
}
let bAndWParams: [String: Any] = [kCIInputImageKey: grayImage,
kCIInputContrastKey: 50.0,
kCIInputBrightnessKey: 10.0]
guard let bAndWImage = CIFilter(name: "CIColorControls", withInputParameters: bAndWParams)?.outputImage else {
return nil
}
guard let cgImage = CIContext(options: nil).createCGImage(bAndWImage, from: bAndWImage.extent) else {
return nil
}
return UIImage(cgImage: cgImage)
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
8926 次 |
| 最近记录: |