Ceci est possible et j'ai essayé précédemment deux chemins:
Convertir en Niveaux de gris puis appliquez pixel par conversion de pixels à B & W.
--Problem c'est que je ne reçois pas de bons résultats avec des images avec transparence. Si vous n'êtes pas très strict, compte tenu d'une image RGBA, obtenez la moyenne en pixels RVB et convertissez en B & W avec un seuil fourni et gardez sa transparence. Techniquement c'est encore RGBA mais plus de Noir, Blanc et Transparence.
par exemple.
UIImage *originalImage = [UIImage imageNamed:@"option_bluetooth.png"];
unsigned char *pixelBuffer = [self getPixelData:originalImage.CGImage];
size_t length = originalImage.size.width * originalImage.size.height * 4;
CGFloat intensity;
int bw;
//50% threshold
const CGFloat THRESHOLD = 0.5;
for (int index = 0; index < length; index += 4)
{
intensity = (pixelBuffer[index] + pixelBuffer[index + 1] + pixelBuffer[index + 2])/3./255.;
if (intensity > THRESHOLD) {
bw = 255;
} else {
bw = 0;
}
pixelBuffer[index] = bw;
pixelBuffer[index + 1] = bw;
pixelBuffer[index + 2] = bw;
}
CGColorSpaceRef colorSpace=CGColorSpaceCreateDeviceRGB();
CGContextRef bitmapContext=CGBitmapContextCreate(pixelBuffer, originalImage.size.width, originalImage.size.height, 8, 4*originalImage.size.width, colorSpace, kCGImageAlphaPremultipliedLast | kCGBitmapByteOrderDefault);
CFRelease(colorSpace);
free(pixelBuffer);
CGImageRef cgImage=CGBitmapContextCreateImage(bitmapContext);
CGContextRelease(bitmapContext);
UIImage *bwImage = [UIImage imageWithCGImage:cgImage];
Je reçois les données de pixels en écrivant à un contexte offscreen (la nouvelle façon d'obtenir les données brutes dont Apple suggère ne fonctionne pas pour moi)
par exemple
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
unsigned char *rawData = malloc(imageHeight * imageWidth * 4);
CGContextRef offscreenContext = CGBitmapContextCreate(rawData, imageWidth, imageHeight,
bitsPerComponent, bytesPerRow, colorSpace,
kCGImageAlphaPremultipliedLast | kCGBitmapByteOrderDefault);
CGColorSpaceRelease(colorSpace);
CGContextDrawImage(offscreenContext, CGRectMake(0, 0, imageWidth, imageHeight), cgCropped);
CGContextRelease(offscreenContext);
Voici le code pour obtenir des données Pixel
+ (unsigned char *) getPixelData: (CGImageRef) cgCropped {
size_t imageWidth = CGImageGetWidth(cgCropped);
size_t imageHeight = CGImageGetHeight(cgCropped);
size_t bitsPerComponent = 8;
size_t bytesPerPixel = 4;
size_t bytesPerRow = bytesPerPixel * imageWidth;
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
unsigned char *rawData = malloc(imageHeight * imageWidth * 4);
CGContextRef offscreenContext = CGBitmapContextCreate(rawData, imageWidth, imageHeight,
bitsPerComponent, bytesPerRow, colorSpace,
kCGImageAlphaPremultipliedLast | kCGBitmapByteOrderDefault);
CGColorSpaceRelease(colorSpace);
CGContextDrawImage(offscreenContext, CGRectMake(0, 0, imageWidth, imageHeight), cgCropped);
CGContextRelease(offscreenContext);
return rawData;
}
Le noir et blanc ne serait-il pas une image 1 bit plutôt que 2? 2 bits vous offriraient quatre couleurs différentes. –