سؤال

لماذا يقوم هذا الكود بتعيين صورة الفنان على صورة بعرض 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
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top