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

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

00 01 02 03 04 05

10 11 12 13 14 15

20 21 22 23 24 25

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

Обновление

Вот что у меня сейчас есть:

 inputImgAvg //Image for processing
 CGContextRef context = UIGraphicsGetCurrentContext();

 float  yy = groutW / 2;            // skip over grout on edge
     float stride =(int) (tileW + groutW +0.5);
        for(int y=0; y<tilesY; y++) {               //Number tile in Y direction
            float xx = groutW / 2 ;         // skip over grout on edge
            for(int x=0; x<tilesX; x++) {
                tileRGB = [inputImgAvg colorAtPixel:CGPointMake(x,y)];

                //Right here I'm checking tileRGB with list of available color
                //Find out the closest color 
                //Now i'm just checking with greenColor

                // best matching tile is found in idx position in vector;
                // scale and copy it into proper location in the output
                CGContextSetFillColor(context, CGColorGetComponents( [[UIColor greenColor] CGColor]));

Но я получил эту ошибку.Вы можете указать, что я сделал не так?

<Error>: CGContextSetFillColor: invalid context 0x0
<Error>: CGContextFillRects: invalid context 0x0

1 Ответ

2 голосов
/ 30 января 2012

Эта тема отвечает на вопрос:

http://www.iphonedevsdk.com/forum/iphone-sdk-development/34247-cgimage-pixel-array.html

Создайте CGContext, используя CGBitmapContextCreate, который позволяет вам предоставлять данные для изображения. Затем вы можете записывать пиксели в данные, используя указатель и устанавливая байты самостоятельно.

Как только вы закончите, используйте UIGraphicsGetImageFromCurrentContext () или эквивалентный для захвата данных контекста в объект UIImage.

Если все это кажется немного низкоуровневым, другой вариант будет просто создать CGContext и нарисовать прямоугольники 1x1 в нем. Это не будет удивительно быстро, но не так медленно, как вы думаете, потому что все функции CG - это чистый C, а компилятор оптимизирует любую избыточность:

//create drawing context
UIGraphicsBeginImageContextWithOptions(CGSizeMake(width, height), NO, 0.0f);
CGContextRef context = UIGraphicsGetCurrentContext();  

//draw pixels
for (int x = 0; x < width; x++)
{
   for (int y = 0; y < height; y++)
   {
      CGContextSetFillColor( ... your color here ... );
      CGContextFillRect(context, CGRectMake(x, y, 1.0f, 1.0f));
   }
}

//capture resultant image
UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
...