Окончательный ответ, который разрешил проблему: Большое спасибо Стиву. Вы очень помогли. Я изучал географию в колледже, а не программировал, так что это довольно сложно для меня. Вот последний код, который работает для меня.
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 ()» и следующие четыре строки кода, которые включают создание массивов. Я рад, что вы это сделали, потому что я смотрю на него, и он все еще не погружается. Большое вам спасибо. Это очень помогает. Дэвид
Этот может вам помочь.
Когда вы закончите, вы можете использовать CGImageCreate
для создания CGImageRef, а затем использовать + [ UIImage imageWithCGImage:]
для создания нового UIImage.
Вы не можете получить исходные пиксели. Однако вы можете получить копию. Один из вариантов - сделать то, что предложил Мэтт, и преобразовать его в 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
Короткий ответ - нет. Однако вы говорите, что в любом случае вам нужно сделать копию, так почему бы просто не получить объект NSData и не манипулировать его байтами.
Из документации Apple по UIImage:
Поскольку объекты изображений неизменяемы, они также не предоставляют прямого доступа к их базовым данным изображения. Однако вы можете получить объект NSData содержащий либо PNG, либо JPEG представление данных изображения с помощью Представление UIImagePNG и UIImageJPEGRepresentation functions.
Чтобы получить данные в формате PNG, используйте:
NSData * UIImagePNGRepresentation (
UIImage *image
);
для JPEG, используйте:
NSData * UIImageJPEGRepresentation (
UIImage *image,
CGFloat compressionQuality
);
Для более тупые среди нас (прочитайте: будущее меня) Вот какой-то рабочий код на основе ответов 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);