Как сравнить цвета в массиве и пиксель на изображении и создать новое изображение с ближайшим цветом в массиве iOS? - PullRequest
0 голосов
/ 27 января 2012

Я пытаюсь обработать входное изображение, прочитав все пиксели его данных, а затем сравнить со всеми цветами в массиве, чтобы создать новое изображение. Но я заблудился в проблемах и застрял. Пожалуйста, помогите, это то, что у меня сейчас.

 //This is find different of two UIColor
 int ColorDiff(UIColor *color1 ,UIColor *color2){
     ...Compare RGB components going on
 }

                             My first try

        // init vars
        int d   = 0;                            // squared error
        int idx = 0;                            // index of color
        int min = 1000000;                      // min difference
        int paletteSize = pathArray.count;      // number of available color
        UIColor *currentRGB;                    // current color at a pixel in image
        UIColor *paletteRGB;                    // palette color


        // visit each output pixel and determine closest color from array
        for(int y=0; y<sizeY; y++) {            // sizeY in pixel is height of processing image  
            for(int x=0; x<sizesX; x++) {       // sizeX in pixel is width of processing image 

                // inputImgAvg is image for processing
                currentRGB = [inputImgAvg colorAtPixel:CGPointMake(x,y)];


                // find closest color match in array: init idx with index
                // of closest match; keep track of min to find idx
                min = 1000000;
                idx = 0;
                for(int i = 0; i < paletteSize ;i++){          
                    //colorAverages is array holding avail color
                    paletteRGB = [colorAverages objectAtIndex:i];

                    d = ColorDiff(paletteRGB ,currentRGB);
                    if( d< min){
                        min = d;
                        idx = i;
                    }
                }

                // best matching color is found in idx position in vector;

                // I'm stuck here how to draw [colorAverages objectAtIndex:idx]
                // which is best matching for current pixel on image

Я не знаю, как распечатать обработанное изображение.


                               My second try

 //This is how it get image data for processing
 CGImageRef srcImgProcess = inputImgAvg.CGImage; //inputImgAvg is image at begin

 CFDataRef theData;
 theData = CGDataProviderCopyData(CGImageGetDataProvider(srcImgProcess));
 UInt8 *pixelData = (UInt8 *) CFDataGetBytePtr(theData);
 int dataLength = CFDataGetLength(theData);

 //PROBLEM IS HERE...
 //Now I loop thru the pixeldata
 for (int i = 0; i < dataLength; i += 4) { // I hope increment by 4 is corrected, bc RGBA
    // listAvailColor is an array holding available color for image processing 
    currentRGB = [listAvailColor objectAtIndex:i]

    // I'm stuck here. How to use pixelData for the comparison?
    // I want to compare pixelData[i] and currentRGB by using my function "ColorDiff(UIColor *color1 ,UIColor *color2)" and then
    // It should return "useful datas" for CGContextRef for drawing new image.
    // That's all my thought right now. 
    // If you guys have any idea, please help to solve this.
 }

Пожалуйста, помогите мне. Любые советы будут с благодарностью

1 Ответ

0 голосов
/ 27 января 2012

Для новичков в Quartz 2D / Core graphic. Вот ссылка , которая очень помогла мне лучше понять Quart 2D и направила меня в правильном направлении для решения моей проблемы.

...