、それ例えば、表示サイズを参照することができます。NSImageでは、異なる出力サイズで使用するためbitmapRepresentationsの数を有することができる。
を同様に、何もbitmapRepresentationsを変えないためにないNSImageではのサイズ属性を変更
だから何をあなたは、あなたの出力イメージが欲しいサイズを探し出し、ソースNSImageからbitmapRepresentationを使ってそのサイズで新しいイメージを描画する必要があります。
このサイズを取得する方法は、入力イメージの取得方法とその知識についてです。たとえば、あなたが入力画像が一つだけbitmapImageRepを持っているあなたは(NSImageでは上のカテゴリとして)事のこのタイプを使用することができると確信していた場合
- (NSSize) pixelSize
{
NSBitmapImageRep* bitmap = [[self representations] objectAtIndex:0];
return NSMakeSize(bitmap.pixelsWide,bitmap.pixelsHigh);
}
あなたがbitmapImageRepsの数を持っている場合でも、最初の1があるべきそれがあなたの網膜画像が作成されたサイズであれば、それは後の網膜サイズでなければなりません。
、あなたの最終的なサイズを働いていたとき、あなたは画像を作ることができます。
- (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;
}
ここで更新
は、ピクセル、サイズのより精巧なバージョンです。 NSImageでカテゴリを取得します...画像について何も仮定しません。画像の数はどれくらいですか? bitmapImageReps ...これは最大のピクセル寸法を返します。i見つけることができます。 bitMapImageRepピクセルディメンションが見つからない場合は、得られるものは何でも使用できます(epsおよび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
あなたの現在のファイルの#import "NSImage+PixelSize.h"
は、それがアクセスできるようにするでしょう。この画像カテゴリとリサイズして
:方法、あなたは、このようにあなたの方法を変更します:
//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];
をがあなたのための(条件を:私はあなたのコードでそれをテストしていない)ものを修正する必要があることを
`setScalesWhenResized::` は
ここで*は*動作しませんソリューションです。以前はこれをどのようにしていたのですが、Snow Leopard以来廃止され、ライオンのようには機能しません。 –
あなたはちょうどそれを小さな矩形で描くことはできませんか?または、ヒントとしてNSAffineTransformを渡しますか? –
@RamyAlZuhouri:アプリケーションが2倍のアセットを作成し、同じアセットから1倍のアセットを作成するために、イメージの解像度を下げて結果を保存することが目的のようです。 –