Могу ли я редактировать пиксели свойства UIImage CGImage

Окончательный ответ, который разрешил проблему: Большое спасибо Стиву. Вы очень помогли. Я изучал географию в колледже, а не программировал, так что это довольно сложно для меня. Вот последний код, который работает для меня.

 import pyodbc
    import matplotlib.pyplot as plt
    MySQLQuery = """
    SELECT 
      DATEPART(WEEKDAY, IIU_tDispatch)AS [IntegerOfDayOfWeek]
    , COUNT(DATENAME(WeekDay, IIU_tDispatch)) AS [DispatchesOnThisWeekday]
    , DATENAME(WEEKDAY, IIU_tDispatch)AS [DayOfWeekOfCall]
    FROM IIncidentUnitSummary
    INNER JOIN PUnit ON IIU_kUnit = PUN_Unit_PK
    WHERE PUN_UnitAgency = 'LC'
    AND IIU_tDispatch BETWEEN 'October 1, 2010' AND 'October 1, 2011'
    AND PUN_UnitID LIKE 'M__'
    GROUP BY DATEPART(WEEKDAY, IIU_tDispatch), DATENAME(WEEKDAY, IIU_tDispatch)
    ORDER BY DATEPART(WEEKDAY, IIU_tDispatch)
    """
    cnxn = pyodbc.connect("a bunch of stuff I don't want to share")
    cursor = cnxn.cursor()
    GraphCursor = cnxn.cursor()
    cursor.execute(MySQLQuery)

    results = cursor.fetchall()
    IntegerDayOfWeek, DispatchesOnThisWeekday, DayOfWeekOfCall = zip(*results)
    tickpositions = [int(r[0]) for r in results]
    numincidents = [int(r[1]) for r in results]
    ticklabels = [r[2] for r in results]
    plt.bar(tickpositions, numincidents)
    plt.xticks(tickpositions, ticklabels)
    #plt.bar(DayOfWeekOfCall, DispatchesOnThisWeekday)
    plt.grid()
    plt.title('Dispatches by Day of Week')
    plt.xlabel('Day of Week')
    plt.ylabel('Number of Dispatches')
    plt.show()

    cursor.close()
    cnxn.close()

Я действительно не понимаю строки между «results = cursor.fetchall ()» и следующие четыре строки кода, которые включают создание массивов. Я рад, что вы это сделали, потому что я смотрю на него, и он все еще не погружается. Большое вам спасибо. Это очень помогает. Дэвид

13
задан Peter Hosey 27 January 2010 в 03:23
поделиться

4 ответа

Этот может вам помочь.

Когда вы закончите, вы можете использовать CGImageCreate для создания CGImageRef, а затем использовать + [ UIImage imageWithCGImage:] для создания нового UIImage.

6
ответ дан 1 December 2019 в 18:06
поделиться

Вы не можете получить исходные пиксели. Однако вы можете получить копию. Один из вариантов - сделать то, что предложил Мэтт, и преобразовать его в PNG / JPG - хотя помните, что изображение теперь сжато, и вы будете манипулировать сжатым файлом, а не пикселями напрямую.

Если вы хотите получить копию необработанных пикселей, вы можете сделать что-то вроде:

UIImage* image = ...; // An image
NSData* pixelData = (NSData*) CGDataProviderCopyData(CGImageGetDataProvider(image.CGImage));
void* pixelBytes = [pixelData bytes];

// Take away the red pixel, assuming 32-bit RGBA
for(int i = 0; i < [pixelData length]; i += 4) {
    bytes[i] = 0; // red
    bytes[i+1] = bytes[i+1]; // green
    bytes[i+2] = bytes[i+2]; // blue
    bytes[i+3] = bytes[i+3]; // alpha
}

Теперь, если вы хотите превратить это в новый UIImage, вы можете сделать что-то вроде:

NSData* newPixelData = [NSData dataWithBytes:pixelBytes length:[pixelData length]];
UIImage* newImage = [UIImage imageWithData:newPixelData]; // Huzzah
14
ответ дан 1 December 2019 в 18:06
поделиться

Короткий ответ - нет. Однако вы говорите, что в любом случае вам нужно сделать копию, так почему бы просто не получить объект NSData и не манипулировать его байтами.

Из документации Apple по UIImage:

Поскольку объекты изображений неизменяемы, они также не предоставляют прямого доступа к их базовым данным изображения. Однако вы можете получить объект NSData содержащий либо PNG, либо JPEG представление данных изображения с помощью Представление UIImagePNG и UIImageJPEGRepresentation functions.

Чтобы получить данные в формате PNG, используйте:

NSData * UIImagePNGRepresentation (
   UIImage *image
);

для JPEG, используйте:

NSData * UIImageJPEGRepresentation (
   UIImage *image,
   CGFloat compressionQuality
);
3
ответ дан 1 December 2019 в 18:06
поделиться

Для более тупые среди нас (прочитайте: будущее меня) Вот какой-то рабочий код на основе ответов ITAY и DAVE R. Он начинается с Uiimage и заканчивается модифицированным Uiimage:

    // load image
    UIImage *image      = [UIImage imageNamed:@"test.png"];
    CGImageRef imageRef = image.CGImage;
    NSData *data        = (NSData *)CGDataProviderCopyData(CGImageGetDataProvider(imageRef));
    char *pixels        = (char *)[data bytes];

    // this is where you manipulate the individual pixels
    // assumes a 4 byte pixel consisting of rgb and alpha
    // for PNGs without transparency use i+=3 and remove int a
    for(int i = 0; i < [data length]; i += 4)
    {
        int r = i;
        int g = i+1;
        int b = i+2;
        int a = i+3;

        pixels[r]   = 0; // eg. remove red
        pixels[g]   = pixels[g];
        pixels[b]   = pixels[b];
        pixels[a]   = pixels[a];
    }

    // create a new image from the modified pixel data
    size_t width                    = CGImageGetWidth(imageRef);
    size_t height                   = CGImageGetHeight(imageRef);
    size_t bitsPerComponent         = CGImageGetBitsPerComponent(imageRef);
    size_t bitsPerPixel             = CGImageGetBitsPerPixel(imageRef);
    size_t bytesPerRow              = CGImageGetBytesPerRow(imageRef);

    CGColorSpaceRef colorspace      = CGColorSpaceCreateDeviceRGB();
    CGBitmapInfo bitmapInfo         = CGImageGetBitmapInfo(imageRef);
    CGDataProviderRef provider      = CGDataProviderCreateWithData(NULL, pixels, [data length], NULL);

    CGImageRef newImageRef = CGImageCreate (
                              width,
                              height,
                              bitsPerComponent,
                              bitsPerPixel,
                              bytesPerRow,
                              colorspace,
                              bitmapInfo,
                              provider,
                              NULL,
                              false,
                              kCGRenderingIntentDefault
                              );
    // the modified image
    UIImage *newImage   = [UIImage imageWithCGImage:newImageRef];

    // cleanup
    free(pixels);
    CGImageRelease(imageRef);
    CGColorSpaceRelease(colorspace);
    CGDataProviderRelease(provider);
    CGImageRelease(newImageRef);
14
ответ дан 1 December 2019 в 18:06
поделиться
Другие вопросы по тегам:

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