Musisz być bardzo ostrożny atrybut rozmiaru NSImage. To niekoniecznie odnoszą się do wymiarów w pikselach na bitmapRepresentation za to może odnosić się do wyświetlanej wielkości np. NSImage może mieć szereg bitmapRepresentations do zastosowania w różnych wielkościach wyjściowych.
Podobnie, zmieniając atrybut rozmiaru NSImage nie robi nic, aby zmienić bitmapRepresentations
więc co musisz obliczyć rozmiar, który ma być obrazem wyjściowym, a następnie narysować nowy obraz w tym rozmiarze za pomocą bitmapReprezentacja ze źródła NSImage.
Uzyskanie tego rozmiaru zależy od tego, w jaki sposób uzyskałeś obraz wejściowy i co o nim wiesz. Na przykład, jeśli jesteś przekonany, że obraz wejściowy ma tylko jeden bitmapImageRep można użyć tego typu rzeczy (jako kategoria na NSImage)
- (NSSize) pixelSize
{
NSBitmapImageRep* bitmap = [[self representations] objectAtIndex:0];
return NSMakeSize(bitmap.pixelsWide,bitmap.pixelsHigh);
}
Nawet jeśli mają szereg bitmapImageReps, pierwszy powinien być największy, a jeśli jest to rozmiar, w którym został utworzony twój obraz siatkówki, powinien to być rozmiar siatkówki, którego szukasz.
Po wypracowaliśmy swój ostateczny rozmiar, można zrobić obraz:
- (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;
}
aktualizacji
Tutaj jest bardziej skomplikowana wersja piksel-size- uzyskanie kategorii na NSImage ... załóżmy, że nie ma nic o obrazie, ile ma on imageReps, czy ma on dowolny bitmapImageReps ... to zwróci największe wymiary piksela i t może znaleźć. Jeśli nie będzie w stanie znaleźć pikseli w pikselach bitmapImageRep, użyje tego, co jeszcze może uzyskać, co najprawdopodobniej będzie wymiarami obwiedni (używanymi przez eps i pdf).
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
można byłoby #import "NSImage+PixelSize.h"
w bieżącym pliku, aby go udostępnić.
z tą kategorią obrazu i zmiany rozmiaru: metoda, by zmodyfikować metodę tak:
//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];
To powinien rzeczy poprawek dla Ciebie (zastrzeżenie: nie testowałem go na kodzie)
Oto rozwiązanie, które nie będzie * * praca: 'setScalesWhenResized:'.Kiedyś tak to zrobiłeś, ale jest przestarzałe od Snow Leopard i nie działa tak jak Lion. –
Nie możesz po prostu narysować go w mniejszej skali? Lub przekazać NSAffineTransform jako wskazówkę? –
@RamyAlZuhouri: Wygląda na to, że aplikacja ma na celu obniżenie rozdzielczości obrazu i zapisanie wyniku, utworzenie zasobów przy 2x i wygenerowanie 1x zasobów z tego samego. –