поляроидный фильтр от UIImage

Я пытаюсь реализовать некоторые фильтры изображений, такие как полароид, в iphone. Я искал, как отфильтровать существующий UIImage, чтобы преобразовать его в стиль polaroid, и наткнулся на эта ссылка на stackoverflow. Взяв ответ в качестве отправной точки, я просмотрел каждый пиксель изображения, взяв значения RGB и преобразовав их в HSV, до этого момента я добился успеха. Так вот что я сделал (любой может указать на любые ошибки..)

double minRGB(double r, double g, double b){
    if (r < g){
        if (r < b){
            return r;
        }else {
            return b;
        }
    }else { 
        if (g < b){
            return g;
        }else{
            return b;
        }
    }
}



double maxRGB(double r, double g, double b){
    if (r > g){
        if (r > b){
            return r;
        }else {
            return b;
        }
    }else { 
        if (g > b){
            return g;
        }else {
            return b;
        }
    }
}

void rgbToHsv(double redIn,double greenIn,double blueIn,double *hue,double *saturation,double* value){
    double min,max,delta;

    min                         =   minRGB(redIn,greenIn,blueIn);
    max                         =   maxRGB(redIn,greenIn,blueIn);
    *value                      =   max;
    delta                       =   max - min;
    if (max != 0) {
        *saturation             =   delta/max;
    }else {
        *saturation             =   0;
        *hue                        =   -1.0;
        return ;
    }
    if (redIn == max) {
        *hue                    =   (greenIn - blueIn)/delta;
    }else if (greenIn == max) {
        *hue                    =   2 + (blueIn - redIn)/delta;
    }else {
        *hue                    =   4 + (redIn - greenIn)/delta;
    }
    *hue                        *=  60.0;
    if (*hue < 0) {
        *hue                    +=  360.0;
    }
}

void hsvToRgb(double h,double s, double v, double *r,double *g, double *b){
    int i;
    float f, p, q, t;
    if( s == 0 ) {
        // achromatic (grey)
        *r = *g = *b = v;
        return;
    }
    h                           /=  60;         // sector 0 to 5
    i                           =   floor( h );
    f                           =   h - i;          // factorial part of h
    p                           =   v * ( 1 - s );
    q                           =   v * ( 1 - s * f );
    t                           =   v * ( 1 - s * ( 1 - f ) );
    switch( i ) {
        case 0:
            *r = v;
            *g = t;
            *b = p;
            break;
        case 1:
            *r = q;
            *g = v;
            *b = p;
            break;
        case 2:
            *r = p;
            *g = v;
            *b = t;
            break;
        case 3:
            *r = p;
            *g = q;
            *b = v;
            break;
        case 4:
            *r = t;
            *g = p;
            *b = v;
            break;
        default:        // case 5:
            *r = v;
            *g = p;
            *b = q;
            break;
    }
}


-(void)makeImagePolaroid:(UIImage*)myImage{
CGImageRef originalImage        =   [myImage CGImage];
CGColorSpaceRef colorSpace      =   CGColorSpaceCreateDeviceRGB();
CGContextRef bitmapContext      =   CGBitmapContextCreate(NULL,CGImageGetWidth(originalImage),CGImageGetHeight(originalImage),8,CGImageGetWidth(originalImage)*4,colorSpace,kCGImageAlphaPremultipliedLast);
CGColorSpaceRelease(colorSpace);
CGContextDrawImage(bitmapContext, CGRectMake(0, 0, CGBitmapContextGetWidth(bitmapContext), CGBitmapContextGetHeight(bitmapContext)), originalImage);
UInt8 *data                     =   CGBitmapContextGetData(bitmapContext);
int numComponents               =   4;
int bytesInContext              =   CGBitmapContextGetHeight(bitmapContext) * CGBitmapContextGetBytesPerRow(bitmapContext);
double redIn, greenIn, blueIn,alphaIn;
double hue,saturation,value;

for (int i = 0; i < bytesInContext; i += numComponents) {
    redIn                       =   (double)data[i]/255.0;
    greenIn                     =   (double)data[i+1]/255.0;
    blueIn                      =   (double)data[i+2]/255.0;
    alphaIn                     =   (double)data[i+3]/255.0;
    
    rgbToHsv(redIn,greenIn,blueIn,&hue,&saturation,&value);
    
    hue                         =   hue * 0.7;
    if (hue > 360) {
        hue                     =   360;
    }
    
    saturation                  =   saturation *1.3;
    if (saturation > 1.0) {
        saturation              =   1.0;
    }

    value                       =   value * 0.8;
    if (value > 1.0) {
        value                   =   1.0;
    }
    
    hsvToRgb(hue,saturation,value,&redIn,&greenIn,&blueIn);
    data[i]                     =   redIn * 255.0;
    data[i+1]                   =   greenIn * 255.0;
    data[i+2]                   =   blueIn * 255.0;
}
CGImageRef outImage             =   CGBitmapContextCreateImage(bitmapContext);
myImage                         =   [UIImage imageWithCGImage:outImage];
CGImageRelease(outImage);
return myImage;
}

Теперь мое представление об обработке изображений очень детское (даже не любительское). Я прочитал это и попытался настроить насыщенность и оттенок, чтобы увидеть, смогу ли я получить полароидный эффект.. Я думаю, что я что-то упускаю, потому что я получил все эффекты на земле, кроме полароидного (говоря, что у меня ничего нет)..

  1. Есть ли какой-либо документ в сети (или книги), в котором рассказывается о фильтрации изображений с точки зрения программиста? (и не с дизайнерской точки зрения и без фотошопа)
  2. Какую разницу в оттенке, насыщенности, значении я должен сделать для пикселя, чтобы я мог сделать его полароидным?
  3. И в-третьих, на правильном ли я пути?

Заранее спасибо..


person Krishnabhadra    schedule 08.04.2011    source источник
comment
похоже я один в этом :(   -  person Krishnabhadra    schedule 09.04.2011


Ответы (2)


Это может быть полезно, поскольку Camera+ берет фильтры из фотошопа и воспроизводит их для iOS.

http://taptaptap.com/blog/creating-a-camera-plus-fx/

person richy    schedule 17.06.2011
comment
Спасибо, Ричи, за ответ. Но я уже видел этот урок... и пробовал его тоже... Но, к сожалению, это не сработало... - person Krishnabhadra; 18.06.2011

person    schedule
comment
Сатиш Азад, Что ж, спасибо за ответы, хотя я больше не работаю над этим.. Но не ставьте несколько ответов в одном вопросе.. Отредактируйте любой из 4 ответов и скажите все там.. Удалить остальные 3 ответа. Если нет, есть все шансы, что против вас примут меры за спам - person Krishnabhadra; 29.12.2012
comment
Можете ли вы преобразовать его в быстрый? - person Rubaiyat Jahan Mumu; 05.04.2017
comment
Рубаи Джахан Муму: Да, я могу конвертировать. Но я предлагаю вам использовать объективный код C внутри исходного кода Swift, используя заголовки мостов, которые связывают объективный класс C с классами Swift. - person Satish Azad; 05.04.2017