Изменение размера изображения - Какао - MAC OS X - PullRequest
3 голосов
/ 04 июля 2011

Я пытаюсь написать небольшую библиотеку, которая делает снимок экрана и сохраняет изображение на диске.

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

int imageWidth = 200;
int imageHeight = 200;

CFStringRef keys[2];
CFTypeRef   values[2];
keys[0]   = kCGImagePropertyDPIHeight;
values[0] = CFNumberCreate(NULL, kCFNumberIntType, &imageHeight);
keys[1]   = kCGImagePropertyDPIWidth;
values[1] = CFNumberCreate(NULL, kCFNumberIntType, &imageWidth);


CFDictionaryRef options = NULL;
options = CFDictionaryCreate( NULL, (const void **)keys, (const void **)values, 2,
                               &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks);

// Set the image in the image destination to be `image' with
// optional properties specified in saved properties dict.
CGImageDestinationAddImage(dest, imageRef, options);

bool success = CGImageDestinationFinalize(dest);
NSAssert( success != 0, @"Image could not be written successfully");

Пожалуйста, дайте мне знать, если я делаю что-то не так.

Ответы [ 3 ]

3 голосов
/ 04 июля 2011

не уверен, что может произойти много вещей, не видя, как вы делаете CGImageRef, было бы трудно увидеть проблему.Вы пытались использовать NSImage, с которым очень легко работать.

NSImage * img = [[NSImage alloc] initWithCGImage:imageRef size:NSZeroSize];
[img setSize: NSMakeSize(imageWidth,imageHeight)];

//do something with img;
[img release];

Если вам не удастся установить некоторые контрольные точки, и убедитесь, что все, что вы считаете действительным, действительно.

1 голос
/ 04 июля 2011

Это делает мою работу, не уверен, насколько это эффективно.

int imageWidth  = 200;
int imageHeight = 200;

CGContextRef    context = NULL;
CGColorSpaceRef colorSpace;
void *          bitmapData;
int             bitmapByteCount;
int             bitmapBytesPerRow;

// Get image width, height. We'll use the entire image.
size_t pixelsWide = imageWidth;//CGImageGetWidth(imageRef);
size_t pixelsHigh = imageHeight;//CGImageGetHeight(imageRef);

// Declare the number of bytes per row. Each pixel in the bitmap in this
// example is represented by 4 bytes; 8 bits each of red, green, blue, and
// alpha.
bitmapBytesPerRow   = (pixelsWide * 4);
bitmapByteCount     = (bitmapBytesPerRow * pixelsHigh);

// Use the generic RGB color space.
colorSpace = CGColorSpaceCreateWithName(kCGColorSpaceGenericRGB);

// Allocate memory for image data. This is the destination in memory
// where any drawing to the bitmap context will be rendered.
bitmapData = malloc( bitmapByteCount );

// Create the bitmap context. We want pre-multiplied ARGB, 8-bits 
// per component. Regardless of what the source image format is 
// (CMYK, Grayscale, and so on) it will be converted over to the format
// specified here by CGBitmapContextCreate.
context = CGBitmapContextCreate (bitmapData,
                                 pixelsWide,
                                 pixelsHigh,
                                 8,      // bits per component
                                 bitmapBytesPerRow,
                                 colorSpace,
                                 kCGImageAlphaPremultipliedFirst);

// Make sure and release colorspace before returning
CGColorSpaceRelease( colorSpace );

// Get image width, height. We'll use the entire image.
size_t w = CGImageGetWidth(imageRef);
size_t h = CGImageGetHeight(imageRef);
CGRect rect = {{0,0},{imageWidth,imageHeight}}; 

// Draw the image to the bitmap context. Once we draw, the memory 
// allocated for the context for rendering will then contain the 
// raw image data in the specified color space.
CGContextDrawImage(context, rect, imageRef);

CGImageRef outImageRef = NULL;

outImageRef = CGBitmapContextCreateImage( context );
1 голос
/ 04 июля 2011

Я не думаю, что kCGImagePropertyDPIWidth и kCGImagePropertyDPIHeight являются значимыми вариантами для CGImageDestinationAddImage.Вам нужно создать новое изображение с заданным размером и записать , что в место назначения.

Это можно сделать несколькими способами, но, возможно, самый простой - через NSImage использовать Грэдипредлагает.Вы также можете создать новый CGBitmapContext нужного размера и формата пикселей, нарисовать существующее изображение в нем с помощью CGContextDrawImage, а затем извлечь новый CGImageRef с помощью CGBitmapContextCreateImage.Это немного утомительно, но должно привести вас туда, куда вы хотите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...