Hay que ser muy cuidadoso del atributo tamaño de un NSImage. No necesariamente se refiere a las dimensiones en píxeles de la bitmapRepresentation, se podría referirse al tamaño que se muestra por ejemplo. un NSImage puede tener un número de bitmapRepresentations para su uso en diferentes tamaños de salida.
del mismo modo, cambiando el atributo tamaño de un NSImage no puede modificar las bitmapRepresentations
Entonces, ¿qué lo que debe hacer es calcular el tamaño que desea que tenga su imagen de salida, y luego dibujar una nueva imagen en ese tamaño utilizando un mapa de bits Representación del archivo NSI de origen.
Obtener ese tamaño depende de cómo haya obtenido su imagen de entrada y de lo que sabe al respecto. Por ejemplo, si se tiene la certeza de que su imagen de entrada tiene un solo bitmapImageRep puede utilizar este tipo de cosas (como una categoría en NSImage)
- (NSSize) pixelSize
{
NSBitmapImageRep* bitmap = [[self representations] objectAtIndex:0];
return NSMakeSize(bitmap.pixelsWide,bitmap.pixelsHigh);
}
Incluso si usted tiene un número de bitmapImageReps, el primero debe ser el más grande, y si ese es el tamaño en el que se creó su imagen de Retina, debe ser el tamaño de Retina que está buscando.
Cuando haya elaborado su tamaño final, se puede hacer la imagen:
- (NSImage*) resizeImage:(NSImage*)sourceImage size:(NSSize)size
{
NSRect targetFrame = NSMakeRect(0, 0, size.width, size.height);
NSImage* targetImage = nil;
NSImageRep *sourceImageRep =
[sourceImage bestRepresentationForRect:targetFrame
context:nil
hints:nil];
targetImage = [[NSImage alloc] initWithSize:size];
[targetImage lockFocus];
[sourceImageRep drawInRect: targetFrame];
[targetImage unlockFocus];
return targetImage;
}
actualización
Aquí está una versión más elaborada de un pixel-tamaño- obtener categoría en NSImage ... no asumamos nada de la imagen, cuántos imageReps tiene, si tiene any bitmapImageReps ... esto devolverá las dimensiones de píxeles más grandes i t puede encontrar. Si no puede encontrar las dimensiones de píxel de bitMapImageRep, usará cualquier otra cosa que pueda obtener, lo que probablemente sea una dimensión de recuadro delimitador (utilizado por eps y pdfs).
NSImage + PixelSize.h
#import <Cocoa/Cocoa.h>
#import <QuartzCore/QuartzCore.h>
@interface NSImage (PixelSize)
- (NSInteger) pixelsWide;
- (NSInteger) pixelsHigh;
- (NSSize) pixelSize;
@end
NSImage + PixelSize.m
#import "NSImage+PixelSize.h"
@implementation NSImage (Extensions)
- (NSInteger) pixelsWide
{
/*
returns the pixel width of NSImage.
Selects the largest bitmapRep by preference
If there is no bitmapRep returns largest size reported by any imageRep.
*/
NSInteger result = 0;
NSInteger bitmapResult = 0;
for (NSImageRep* imageRep in [self representations]) {
if ([imageRep isKindOfClass:[NSBitmapImageRep class]]) {
if (imageRep.pixelsWide > bitmapResult)
bitmapResult = imageRep.pixelsWide;
} else {
if (imageRep.pixelsWide > result)
result = imageRep.pixelsWide;
}
}
if (bitmapResult) result = bitmapResult;
return result;
}
- (NSInteger) pixelsHigh
{
/*
returns the pixel height of NSImage.
Selects the largest bitmapRep by preference
If there is no bitmapRep returns largest size reported by any imageRep.
*/
NSInteger result = 0;
NSInteger bitmapResult = 0;
for (NSImageRep* imageRep in [self representations]) {
if ([imageRep isKindOfClass:[NSBitmapImageRep class]]) {
if (imageRep.pixelsHigh > bitmapResult)
bitmapResult = imageRep.pixelsHigh;
} else {
if (imageRep.pixelsHigh > result)
result = imageRep.pixelsHigh;
}
}
if (bitmapResult) result = bitmapResult;
return result;
}
- (NSSize) pixelSize
{
return NSMakeSize(self.pixelsWide,self.pixelsHigh);
}
@end
Usted sería #import "NSImage+PixelSize.h"
en su archivo actual para que sea accesible.
Con esta categoría de imagen y el cambio de tamaño: método, deberá modificar su método de este modo:
//size.width = inputRetinaImage.size.width*0.5;
//size.height = inputRetinaImage.size.height*0.5;
size.width = inputRetinaImage.pixelsWide*0.5;
size.height = inputRetinaImage.pixelsHigh*0.5;
//[inputRetinaImage setSize:size];
NSImage* outputImage = [self resizeImage:inputRetinaImage size:size];
//NSBitmapImageRep *imgRep = [[inputRetinaImage representations] objectAtIndex: 0];
NSBitmapImageRep *imgRep = [[outputImage representations] objectAtIndex: 0];
Eso debe arreglar las cosas para usted (condición: que no he probado en su código)
he aquí una solución que * se * no funcionará: 'setScalesWhenResized:'.Solía ser así como lo hiciste, pero está obsoleto desde Snow Leopard y no funciona desde Lion. –
¿No puedes dibujarlo en un rect pequeño? ¿O pasar un NSAffineTransform como pista? –
@RamyAlZuhouri: Parece que la aplicación pretende reducir la resolución de la imagen y guardar el resultado, para crear activos a 2x y producir 1x activos de la misma. –