본문 바로가기

프로그래밍/iOS

[iOS] 이미지 black & white

목표는 이미지 RGB값을 받아와서 

값이 높으면(흰색에 가까우면) 흰색으로 

값이 낮으면(검은색에 가까우면)검은색으로

바꾸어 문서 이미지의 글씨를 좀 더 부곽시키기 위한 용도로 작성


-(UIImage*)convertGrayImage:(UIImage*)image

{

    int orgWidth = (int)CGImageGetWidth(image.CGImage); // 이미지 가로

    int orgHeight = (int)CGImageGetHeight(image.CGImage); // 이미지 세로

    int imagePitch = (int)CGImageGetBytesPerRow(image.CGImage); // 이미지 한줄의 크기

    int pixelPerByte = (int)CGImageGetBitsPerPixel(image.CGImage) / 8; // 픽셀당 바이트 수, 1byte = 8 bits

    

    NSData* imageData = (__bridge_transfer NSData*)CGDataProviderCopyData(CGImageGetDataProvider(image.CGImage)); // 이미지를 데이터로 변환 

    

    for(int y=0; y< orgHeight; y++) // 세로 길이 만큼

    {

        for(int x=0; x< orgWidth; x++) // 가로 길이 만큼 

        {

            int *pDSt = (int *)(imageData.bytes + (y*imagePitch) + (x*pixelPerByte)); // 픽셀을 가져옴 

            int alphaValue = (CFSwapInt32BigToHost(*pDSt) & 0x000000FF); // 픽셀중 알파 값

            int bValue = (CFSwapInt32BigToHost(*pDSt) & 0x0000FF00); // 픽셀 중 blue값

            int gValue = (CFSwapInt32BigToHost(*pDSt) & 0x00FF0000); // 픽셀 중 green값

            int rValue = (CFSwapInt32BigToHost(*pDSt) & 0xFF000000); // 픽셀 중 red 값

            

            int checkValue = 0;

            // alpha

            if(alphaValue == 0) {// 알파 값이 0이면 흰색으로 

                *pDSt = CFSwapInt32BigToHost(*pDSt | 0xFFFFFFFF);

   continue;

}

            // red

            if(rValue >= 0x96000000)

                checkValue += 10;

            // green

            if(gValue >= 0x00960000)

                checkValue += 10;

            // blue

            if(bValue >= 0x00009600)

                checkValue += 10;

            

            checkValue /= 3;

            

            if(checkValue >= 10) // 밝으면 화이트로

                *pDSt = CFSwapInt32BigToHost(0xFFFFFFFF);

            else // 어두우면 블랙으로 

                *pDSt = CFSwapInt32BigToHost(0x000000FF);

        }

    }

    // 변환 된 바이트를 이미지로 

    CGDataProviderRef imgrgbDataProvider = CGDataProviderCreateWithCFData((CFDataRef)imageData);

    CGColorSpaceRef colorSpaceRef = CGColorSpaceCreateDeviceRGB();

    CGBitmapInfo bitmapInfo = CGImageGetBitmapInfo(image.CGImage);

    

    if (!(bitmapInfo & kCGBitmapByteOrder32Big)) // gallary or imageLoad 일 경우

        bitmapInfo |=  kCGImageAlphaNone;


    CGColorRenderingIntent renderingIntent = kCGRenderingIntentDefault;

    

    CGImageRef imageRef = CGImageCreate(orgWidth, orgHeight, 8, pixelPerByte*8, imagePitch,colorSpaceRef, bitmapInfo, imgrgbDataProvider, NULL, false, renderingIntent);

    

    UIImage *resultImage = [UIImage imageWithCGImage:imageRef];

    

    CGImageRelease(imageRef);

    CGColorSpaceRelease(colorSpaceRef);

    CGDataProviderRelease(imgrgbDataProvider);

    

    return resultImage;

}