NSImage يتصرف بغرابة
-
25-09-2019 - |
سؤال
لماذا يقوم هذا الكود بتعيين صورة الفنان على صورة بعرض 0 وارتفاع 0؟
NSURL *artistImageURL = [NSURL URLWithString:@"http://userserve-ak.last.fm/serve/252/8581581.jpg"];
NSImage *artistImage = [[NSImage alloc] initWithContentsOfURL:artistImageURL];
المحلول
يقوم NSImage بتحميل هذا بشكل جيد بالنسبة لي، ولكن هذه الصورة بالذات تحتوي على بيانات وصفية تالفة.دقة الصورة وفقًا لبيانات exif هي 7.1999997999228071e-06 dpi.
يحترم NSImage معلومات DPI الموجودة في الملف، لذلك إذا حاولت رسم الصورة بحجمها الطبيعي، فستحصل على ما يصل إلى 2520000070 بكسل.
نصائح أخرى
كما كتب كين ، فإن 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's
-initWithContentsOfURL:
يعمل فقط مع عناوين URL للملف. ستحتاج إلى استرداد عنوان URL أولاً ، ثم استخدامه -initWithData:
من الضمان أن يكون التمثيل. التقدم يحتوي على 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