Как получить значения RGB для пикселя на изображении на iPhone

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

Что я буду add - это то, что в вашем конкретном случае вам не нужно искать назад или снова открывать файл, вы можете просто сохранить текст, который вы прочитали в локальной переменной, и использовать его дважды или столько раз, сколько вам нравится, в вашей программе:

f = f.open()
text = f.read() # read the file into a local variable
# get the year
match = re.search(r'Popularity in (\d+)', text)
if match:
  print match.group(1)
# get all the names
matches = re.findall(r'<td>(\d+)</td><td>(\w+)</td><td>(\w+)</td>', text)
if matches:
  # matches will now not always be None
37
задан Chris Hanson 21 November 2008 в 10:31
поделиться

5 ответов

Немного больше детали...

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

Метод 1: перезаписываемая информация о пикселе

  1. Я определил константы

    #define RGBA        4
    #define RGBA_8_BIT  8
    
  2. В моем подклассе UIImage я объявил переменные экземпляра:

    size_t bytesPerRow;
    size_t byteCount;
    size_t pixelCount;
    
    CGContextRef context;
    CGColorSpaceRef colorSpace;
    
    UInt8 *pixelByteData;
    // A pointer to an array of RGBA bytes in memory
    RPVW_RGBAPixel *pixelData;
    
  3. Пиксельная структура (с альфой в этой версии)

    typedef struct RGBAPixel {
        byte red;
        byte green;
        byte blue;
        byte alpha;
    } RGBAPixel;
    
  4. Растровая функция (возвраты предварительно вычисленный RGBA; разделите RGB на для получения неизмененного RGB):

    -(RGBAPixel*) bitmap {
        NSLog( @"Returning bitmap representation of UIImage." );
        // 8 bits each of red, green, blue, and alpha.
        [self setBytesPerRow:self.size.width * RGBA];
        [self setByteCount:bytesPerRow * self.size.height];
        [self setPixelCount:self.size.width * self.size.height];
    
        // Create RGB color space
        [self setColorSpace:CGColorSpaceCreateDeviceRGB()];
    
        if (!colorSpace)
        {
            NSLog(@"Error allocating color space.");
            return nil;
        }
    
        [self setPixelData:malloc(byteCount)];
    
        if (!pixelData)
        {
            NSLog(@"Error allocating bitmap memory. Releasing color space.");
            CGColorSpaceRelease(colorSpace);
    
            return nil;
        }
    
        // Create the bitmap context. 
        // Pre-multiplied RGBA, 8-bits per component. 
        // The source image format will be converted to the format specified here by CGBitmapContextCreate.
        [self setContext:CGBitmapContextCreate(
                                               (void*)pixelData,
                                               self.size.width,
                                               self.size.height,
                                               RGBA_8_BIT,
                                               bytesPerRow,
                                               colorSpace,
                                               kCGImageAlphaPremultipliedLast
                                               )];
    
        // Make sure we have our context
        if (!context)   {
            free(pixelData);
            NSLog(@"Context not created!");
        }
    
        // Draw the image to the bitmap context. 
        // The memory allocated for the context for rendering will then contain the raw image pixelData in the specified color space.
        CGRect rect = { { 0 , 0 }, { self.size.width, self.size.height } };
    
        CGContextDrawImage( context, rect, self.CGImage );
    
        // Now we can get a pointer to the image pixelData associated with the bitmap context.
        pixelData = (RGBAPixel*) CGBitmapContextGetData(context);
    
        return pixelData;
    }
    

Данные только для чтения (Предыдущая информация) - метод 2:


Шаг 1. Я объявил тип для байта:

 typedef unsigned char byte;

Шаг 2. Я объявил, что структура соответствовала пикселю:

 typedef struct RGBPixel{
    byte red;
    byte green;
    byte blue;  
    }   
RGBPixel;

Шаг 3. Я разделил UIImageView на подклассы и объявил (с соответствующими синтезируемыми свойствами):

//  Reference to Quartz CGImage for receiver (self)  
CFDataRef bitmapData;   

//  Buffer holding raw pixel data copied from Quartz CGImage held in receiver (self)    
UInt8* pixelByteData;

//  A pointer to the first pixel element in an array    
RGBPixel* pixelData;

Шаг 4. Код подкласса я вставил метод, названный битовым массивом (для возврата растровых пиксельных данных):

//Get the bitmap data from the receiver's CGImage (see UIImage docs)  
[self setBitmapData: CGDataProviderCopyData(CGImageGetDataProvider([self CGImage]))];

//Create a buffer to store bitmap data (unitialized memory as long as the data)    
[self setPixelBitData:malloc(CFDataGetLength(bitmapData))];

//Copy image data into allocated buffer    
CFDataGetBytes(bitmapData,CFRangeMake(0,CFDataGetLength(bitmapData)),pixelByteData);

//Cast a pointer to the first element of pixelByteData    
//Essentially what we're doing is making a second pointer that divides the byteData's units differently - instead of dividing each unit as 1 byte we will divide each unit as 3 bytes (1 pixel).    
pixelData = (RGBPixel*) pixelByteData;

//Now you can access pixels by index: pixelData[ index ]    
NSLog(@"Pixel data one red (%i), green (%i), blue (%i).", pixelData[0].red, pixelData[0].green, pixelData[0].blue);

//You can determine the desired index by multiplying row * column.    
return pixelData;

Шаг 5. Я сделал метод доступа:

-(RGBPixel*)pixelDataForRow:(int)row column:(int)column{
    //Return a pointer to the pixel data
    return &pixelData[row * column];           
}
38
ответ дан Mr. Desai 27 November 2019 в 04:28
поделиться

Вы не можете получить доступ к растровым данным UIImage непосредственно.

необходимо получить представление CGImage UIImage. Тогда получите поставщика данных CGIMAGE от этого представление CFData битового массива. Удостоверьтесь, что выпустили CFData, когда сделано.

CGImageRef cgImage = [image CGImage];
CGDataProviderRef provider = CGImageGetDataProvider(cgImage);
CFDataRef bitmapData = CGDataProviderCopyData(provider);

Вы, вероятно, захотите посмотреть на растровую информацию CGImage для получения порядка пикселей, размеров изображения, и т.д.

11
ответ дан lajos 10 October 2019 в 08:44
поделиться

Ответ Lajos работал на меня. Для получения пиксельных данных как массива байтов я сделал это:

UInt8* data = CFDataGetBytePtr(bitmapData);

[еще 115] информация: документация CFDataRef .

кроме того, не забудьте включать CoreGraphics.framework

5
ответ дан iggames 10 October 2019 в 08:44
поделиться

Чтобы сделать что-то подобное в моем приложении, я создал небольшой внеэкранный CGImageContext, и затем представил UIImage в нем. Это позволило мне быстрый способ извлечь многие пиксели сразу. Это означает, что можно настроить целевой битовый массив в формате, который Вы находите легкими проанализировать, и позволить CoreGraphics сделать тяжелую работу преобразования между цветовыми моделями или растровыми форматами.

1
ответ дан Mark Bessey 10 October 2019 в 08:44
поделиться

Я не знаю, как индексировать в данные изображения правильно на основе, учитывая X, Y координация. Кто-либо знает?

pixelPosition = (x + (y* (imagewidth) *BytesPerPixel)));

//подача не является проблемой с этим устройством насколько я знаю и могу быть позволен нуль...//(или выйтись математика).

1
ответ дан 27 November 2019 в 04:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: