このコードがartistImageを幅0、高さ0の画像に設定するのはなぜですか?
NSURL * ArtistsImageURL = [NSURL URLWithString:@ " http://userserve-ak.last.fm/serve/252/8581581.jpg "];
NSImage * ArtistsImage = [[NSImage alloc] initWithContentsOfURL:artistImageURL];
このコードがartistImageを幅0、高さ0の画像に設定するのはなぜですか?
NSURL * ArtistsImageURL = [NSURL URLWithString:@ " http://userserve-ak.last.fm/serve/252/8581581.jpg "];
NSImage * ArtistsImage = [[NSImage alloc] initWithContentsOfURL:artistImageURL];
ケンが書いたように、DPIはこの画像でめちゃくちゃになっています。NSImageに実際の画像サイズを設定させる(DPIを無視する)場合は、http://borkware.com/quickies/one?topic=NSImageで説明されている方法を使用してください。
NSBitmapImageRep *rep = [[image representations] objectAtIndex: 0];
NSSize size = NSMakeSize([rep pixelsWide], [rep pixelsHigh]);
[image setSize: size];
NSImageは私にとってこれをうまくロードしますが、その特定の画像には破損したメタデータがあります。exifデータによる解像度は7.1999997999228071e-06dpiです。
NSImageは、ファイル内のDPI情報を尊重するため、画像を自然なサイズで描画しようとすると、全体で2520000070ピクセルになります。
最後に確認したところ、NSImage's
-initWithContentsOfURL:
ファイルURLでのみ機能します。最初にURLを取得してから、-initWithData:
.representationsにNSImageRep*が含まれていることが多かれ少なかれ保証されています(もちろん、常にNSBitmapImageRepであるとは限りません)。将来の拡張のために安全を期すために、以下のコードのようなものを書くことができます。また、複数の表現も考慮されます(一部の.icnsファイルや.tiffファイルなど)。
@implementation NSImage (Extension)
- (void) makePixelSized {
NSSize max = NSZeroSize;
for (NSObject* o in self.representations) {
if ([o isKindOfClass: NSImageRep.class]) {
NSImageRep* r = (NSImageRep*)o;
if (r.pixelsWide != NSImageRepMatchesDevice && r.pixelsHigh != NSImageRepMatchesDevice) {
max.width = MAX(max.width, r.pixelsWide);
max.height = MAX(max.height, r.pixelsHigh);
}
}
}
if (max.width > 0 && max.height > 0) {
self.size = max;
}
}
@end