数日前、あなたは (ほぼ) 同じ質問をしましたが、答えがありませんでした。私はあなたの質問に答える時間がありませんでしたが、いくつかのコメントを書く時が来ました。
まず第一に、あなたの質問と (ほとんどの) 回答とコメントは、 とファイルシステムに保存されているイメージの大きな誤解を示してNSImage
いNSImageRep
ます。
ファイルシステムに保存されている画像は、画像のすべてのピクセル (ラスター画像の場合) だけでなく、多くのメタデータ (コメント、日付、カメラに関する情報、サムネイル画像など) を含む複雑なデータ構造です。これは場合によってはさまざまな形式 (exif、photoshop、xml など) になります。そのため、ファイルのサイズが、画面に表示されるコンピューター内の画像や特別なプロパティを求められるものと関係があるとは限りません。さらに使用するためにこれらのデータを取得するには、次のようにします。
NSData *imgData = [NSData dataWithContentsOfURL:url];
また
NSData *imgData = [NSData dataWithContentsOfFile:[url path]];
または、画像を NSImage のオブジェクトとして直接ロードします。
NSImage *image = [[NSImage alloc] initWithContentsOfURL:url]; // similar methods:see the docs
そして、これが Cocoa 構造に変換されたファイル イメージ データだと思うなら、それは間違いです。クラス NSImage のオブジェクトは画像ではなく、ゼロ、1 つ、または複数の画像表現のコンテナです。Gif、jpg、png 画像には常に 1 つの表現しかありません。tiff には 1 つ以上の表現があり、icns には約 5 つか 6 つのイメージ表現があります。
ここで、画像表現に関する情報が必要です。
for( NSUInteger i=0; i<[[image representations] count]; i++ ){
// let us assume we have an NSBitmapImagedRep
NSBitmapImageRep *rep = [[image representations] objectAtIndex:i];
// get informations about this rep
NSUInteger pixelX = [rep pixelsWide];
NSUInteger pixelY = [rep pixelsHigh];
CGFloat sizeX = [rep size].width;
CGFloat sizeY = [rep size].height;
CGFloat resolutionX = 72.0*pixelX/sizeX;
CGFloat resolutionY = 72.0*pixelY/sizeY;
// test if there are padding bits per pixel
if( [rep bitsPerSample]>=8 ){
NSInteger paddingBits = [rep bitsPerPixel] - [rep bitsPerSample]*[rep samplesPerPixel];
// test if there are padding bytes per row
NSInteger paddingBytes = [rep bytesPerRow] - ([rep bitsPerPixel]*[rep pixelsWide]+7)/8;
NSUInteger bitmapSize = [rep bytesPerRow] * [rep pixelsHigh];
}
別の発言:あなたは言った:
イメージ (.tiff) を Macintosh で数百万色 (ピクセルあたり 24 ビット) でスキャンしました。
いいえ、そうである必要はありません。ピクセルに 3 つのコンポーネントしかない場合、いくつかの最適化ルールにより、24 ビットだけでなく 32 ビットを使用することもあります。担当者にお尋ねください。それはあなたに真実を教えてくれます。そして、bitmsapFormat を要求してください! (ドキュメントの詳細)。
最後に: CG 関数を使用する必要はありません。NSImage と NSImageRep がすべてを行います。