0

イメージをロードするために、Mac OSX に次のコードがあります。

NSImage *baseImage = [NSImage imageNamed:[NSString stringWithCString:file.getFilename().c_str() encoding:NSUTF8StringEncoding]];

そして、iOS で画像をロードする次のコード:

UIImage* baseImage = [UIImage imageNamed:[NSString stringWithCString:file.getFilename().c_str() encoding:NSUTF8StringEncoding]];

そして、イメージのロード後に両方のプラットフォームで次の行を実行します。

printf("Surface: \"%s\" size: %d, %d\n", file.getFilename().c_str(), (int)[baseImage size].width, (int)[baseImage size].height);

問題の画像が 72 DPI の場合、両方のプラットフォームで次の出力が得られます。

Surface: "player.png" size: 30, 30 (Mac)
Surface: "player.png" size: 30, 30 (iOS)

ただし、画像が 96 DPI の場合、異なる結果が得られます。

Surface: "player.png" size: 30, 30 (Mac)
Surface: "player.png" size: 40, 40 (iOS)

Mac が 72 DPI に一致するように画像をスケーリングし、iOS がスケーリングしないという奇妙な動作ですが、プラットフォーム間で一貫した結果を得たいと考えています。(できれば 72 DPI に縮小することをお勧めします。)

tl;dr: iOS では、画像の DPI を検出し、それに応じてスケーリングするにはどうすればよいですか?

4

1 に答える 1

2

NSImage インスタンスには、実際には複数のイメージ表現 (NSImageRep のインスタンス) を含めることができ、サイズが異なる場合があります。「サイズ」とは、ピクセル寸法ではなく、作図単位ポイントでのサイズを意味することを理解する必要があります。

ピクセルの寸法が必要な場合は、-bestRepresentationForRect:context:hints: で目的のサイズの NSImageRep を取得してから、-pixelsHigh と -pixelsWide を呼び出します。

PNG 形式には、画像の実際のサイズを説明するフィールドが含まれている場合があり、NSImage はそれを尊重しているように見えますが、おそらく UIImage はそうではありません。

「sips」コマンド ライン ツールを使用して、画像ファイル (png) を調べることができます (詳細については、「man sips」と入力してください)。さまざまな画像形式のピクセル寸法と DPI の両方を読み取って操作するオプションがあります。

于 2013-09-26T04:39:21.180 に答える