0

画像 ( .tiff) を Macintoshmillions of colorsでスキャンしました24 bits per pixel。私が取得しているスキャンされた画像には、次の属性がありsize = 330KBます348 * 580 pixels。1 ピクセルあたり 24 ビットなので、実際のサイズは348 * 580 * 3 = 605KB.

何か間違っていますか?また、このコードを使用して、スキャンした画像の URL から画像の生データを抽出しました。

NSString * urlName = [url path];
NSImage *image = [[NSImage alloc] initWithContentsOfFile:urlName];
NSData *imageData = [image TIFFRepresentation];
CGImageSourceRef source = CGImageSourceCreateWithData((CFDataRef)CFBridgingRetain(imageData), NULL);
CGImageRef imageRef =  CGImageSourceCreateImageAtIndex(source, 0, NULL);
NSUInteger numberOfBitsPerPixel = CGImageGetBitsPerPixel(imageRef);
NSUInteger height = CGImageGetHeight(imageRef);
NSUInteger width = CGImageGetWidth(imageRef);

このコードからも、画像の幅、高さ、およびピクセルあたりのビット数について同じ情報を取得しています。

基本的にはこの画像の情報を使ってどこか別の形で再現しなければならないので、正しい情報が得られないと再現できません。ここで何が間違っている可能性がありますか?

PS: 質問に答えるために他の情報が必要な場合は、喜んで提供します。

4

2 に答える 2

1

最も一般的な画像形式jpgは、画像pngを圧縮します。これが、ファイルサイズがピクセルあたりtiffよりも小さい理由です。w*h*bits

JPEG は非可逆圧縮を使用し、PNG は可逆圧縮を使用し、TIFF は非圧縮、非可逆圧縮または可逆圧縮を使用できます。

非可逆圧縮とは、圧縮によって一部の色情報が失われることを意味するため、画像は圧縮前とまったく同じようには見えませんが、非可逆圧縮を使用するとファイル サイズをさらに縮小できます。

ロスレス圧縮の例はランレングス エンコーディングです。これは基本的に、同じ色の連続するピクセルがいくつかある場合、値を持つピクセルがあると言う代わりにN、値を持つピクセルがあると言うだけであることを意味します。(R,G,B)(R,G,B),(R,G,B),...,(R,G,B)

于 2013-10-03T09:00:43.990 に答える
1

数日前、あなたは (ほぼ) 同じ質問をしましたが、答えがありませんでした。私はあなたの質問に答える時間がありませんでしたが、いくつかのコメントを書く時が来ました。

まず第一に、あなたの質問と (ほとんどの) 回答とコメントは、 とファイルシステムに保存されているイメージの大きな誤解を示してNSImageNSImageRepます。

ファイルシステムに保存されている画像は、画像のすべてのピクセル (ラスター画像の場合) だけでなく、多くのメタデータ (コメント、日付、カメラに関する情報、サムネイル画像など) を含む複雑なデータ構造です。これは場合によってはさまざまな形式 (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 がすべてを行います。

于 2013-10-03T16:11:12.793 に答える