2016-05-21 15 views
0

Ich lade Bilder mit NSImage-Klasse in meiner Anwendung so.NSBeispiel funktioniert nicht mit allen Bildern

if let image = NSImage(contentsOfURL: openPanel.URL!) { 
    ... 
} 

Es funktioniert gut mit den meisten Bildern. Ich konvertiere es dann in CGImage und benutze es wie ich will. Aber mit einigen Bildern stört es einfach und ich kann nicht verstehen warum. Zum Beispiel Wenn ich Bildgröße laden 2133x2133, scheint es wie nichts und wenn ich image.size drucken sehe ich sehr seltsam (511.92, 511.92).

Was kann diese Art von Verhalten verursachen? Alle Bilder sind im PNG-Format. Zur gleichen Zeit kann ich Bild mit der Größe (2048.0, 1536.0) laden und alles funktioniert gut.

Wie sollte man sogar debuggen Laden mit NSImage?

Dies ist das Beispiel eines Bildes:

http://rgho.st/6CVKMR2ZM/image.png

Wenn ich CGImage erstellen aus, dass diese func mit, ich habe nichts zu sehen:

var imageRect = CGRectMake(0, 0, newImage.size.width, newImage.size.height) 
    let imageRef = newImage.CGImageForProposedRect(&imageRect, context: nil, hints: nil) 
+0

Es würde helfen, wenn Sie uns eine Beispielbilddatei gaben, die nicht funktioniert. –

+3

Es ist nicht seltsam, es ist ein 2133x2133 Bild, das eine DPI-Einstellung von 300 Pixel/Zoll hat. (2133/300 = 7,11 Zoll * 72 Punkte/Zoll = 511,92 Punkte) ;-). Ein Beispielbild wäre hilfreich. Das Protokollieren der gesamten Bildinstanz kann normalerweise eine Fülle von Informationen bereitstellen, einschließlich des Typs und der Anzahl der Bildwiederholungen, die der NSImage enthält. (Ein 'NSImage' ist einfach ein Container für einen oder mehrere 'NSImageRep's.) – NSGod

+1

@NSGod: Entschuldigung für ein bisschen pedantisch: Ein' NSImage 'ist einfach ein Container für ** Zero ** oder mehr' NSImageRep's –

Antwort

0

Hier ist meine Lösung: Verwenden Sie reale Bild Größe, nicht die Apple berechnet für mich mit DPI.

var w = 0 
    var h = 0 
    for r in newImage.representations { 
     w = max(w, r.pixelsWide) 
     h = max(h, r.pixelsHigh) 
    } 
    var imageRect = CGRectMake(0, 0, CGFloat(w), CGFloat(h)) 
    let imageRef = newImage.CGImageForProposedRect(&imageRect, context: nil, hints: nil)