2017-08-27 1 views
0

Ich erhalte ein Bild aus dem Backend, das eine große Größe ist, wie ich das gleiche Bild als Profilbild und zeigen Sie das gleiche Bild auf untere Leiste in der Tableiste der Größe 30x30. Ich habe versucht, das Bild auf verschiedene Arten zu verkleinern, aber nichts funktioniert.Scale ein sehr großes Bild auf sehr kleine Größe ohne Verzerrung und Qualitätsverlust

Methode Alamofire versucht hat, das auch nicht funktioniert hat (das Bild erscheint verschwommen und verzerrt werden):

func resizeImageWithoutDistortion(image: UIImage, size : CGSize) -> UIImage{ 


    // 1. Scale image to size disregarding aspect ratio 
    let scaledImage = image.af_imageScaled(to: size) 

    // 2. Scale image to fit within specified size while maintaining aspect ratio 
    let aspectScaledToFitImage = image.af_imageAspectScaled(toFit: size) 

    // 3. Scale image to fill specified size while maintaining aspect ratio 
    let aspectScaledToFillImage = image.af_imageAspectScaled(toFill: size) 

    return scaledImage.roundImage() 
} 

auch versucht, wie folgt, die auch nicht gearbeitet hat:

func resizeImage(_ newWidth: CGFloat) -> UIImage { 

     let ratio = size.width/size.height 
     if ratio > 1 { 
      UIGraphicsBeginImageContext(CGSize(width: newWidth, height: newWidth)) 
      draw(in: CGRect(x: newWidth * ratio/2 - newWidth, y: 0, width: newWidth * ratio, height: newWidth)) 
      let newImage = UIGraphicsGetImageFromCurrentImageContext() 
      UIGraphicsEndImageContext() 

      return newImage!.roundImage() 
     } else { 
      UIGraphicsBeginImageContext(CGSize(width: newWidth, height: newWidth)) 
      draw(in: CGRect(x: 0, y: (newWidth/ratio - newWidth)/2 * (-1), width: newWidth, height: newWidth/ratio)) 
      let newImage = UIGraphicsGetImageFromCurrentImageContext() 
      UIGraphicsEndImageContext() 

      return newImage!.roundImage() 
     } 
    } 

In der Screenshot das Bild im unteren Bereich ist sehr verzerrt. enter image description here

+0

Bitte aktualisieren Sie Ihren Beitrag mit dem, was Sie damit meinen nicht funktioniert, und wenn Sie schon dabei sind: eine Frage sind (dies ist ein Q & A-Site, keine V & S-Site (Vague-description & Suggestion) Sie sollten auch detailliert angeben, wie die Originalbilder aussehen, denn wenn Sie nicht mit hochauflösenden, aber wenig detaillierten Bildern beginnen, können Sie sie nicht auf 30x30 skalieren ohne Qualitätsverlust (und die damit verbundene Verzerrung. ZB indem ich beschreibe, dass die hochauflösenden Bilder ursprünglich aus 30x30 Bildern gesprengt wurden. – Anthon

+0

Hallo, ich habe den Screenshot und al Ich möchte die Qualität des Bildes sowohl im Profilbild als auch in der unteren Leiste beibehalten. – Ishika

+0

Ich nehme an, UIImage sollte das von sich aus tun. Ändern Sie einfach nicht die Größe des Bildes. Lass es so groß bleiben und benutze die Seitenfülle. Um ein Bild rund zu machen, verwende die Ebene des UIImage und runde das, anstatt das Bild wirklich zu manipulieren. Das ist eine sehr kostspielige Operation. Stellen Sie sicher, dass der Aspekt in dieser Bildansicht 1: 1 ist. – BennX

Antwort

0

Ishika, Ihr Problem ist nicht der Qualitätsverlust. Ihr Problem ist, dass Sie die iOS-Skalierung nicht berücksichtigen.

Punkte und Pixel sind nicht die gleiche Sache.

Wenn Sie eine UIImageView haben in W: 30H: 30 (Punkte) Ihr Bild in Pixel zu berechnen, es zu zeigen deutlich, ohne die Qualität zu beeinträchtigen, müssen Sie ein Bild Pixelgröße haben von:

30 * UIScreen.main.scale = 60 Pixel (wenn 2X Skala)

oder

30 * UIScreen.main.scale = 90 Pixel (wenn 3x Skalen)

Dies ist auch der Grund, warum Sie iOS mit @ 2x und @ 3x skalierten Bildern bereitstellen müssen.

Wenn Sie also Ihre UIImage auf eine kleinere Größe ändern möchten, müssen Sie Skalierung in Betracht ziehen. Andernfalls werden Ihre Bilder skaliert, um Ihre UIImageView auszufüllen und sie werden verschwommen, weil die UIImageView größer ist als die UIImage Größe.

Ein guter Weg, dies zu sehen ist, wenn Sie Ihre yourImageView.contentMode = .Center setzen, werden Sie bemerken, dass die UIImage kleiner ist als die UIImageView selbst.

ich nicht Code in Swift, so ich kann Ihnen direkten Code (zu müde, um zu übersetzen) zur Verfügung stellen, aber wenn man sich andere Themen:

scale image to smaller size in swift3

Sie sehen, dass Ihre UIGraphicsBeginImageContext sind für Beispiel fehlt die Skala Eingang.

Skala

Der Skalierungsfaktor auf die Bitmap anzuwenden. Wenn Sie einen Wert von 0,0 angeben, wird der Skalierungsfaktor auf den Skalierungsfaktor des Hauptfensters des Geräts festgelegt.

Edit: In Ihrem Fall so etwas wie dieses:

newWidth = newWidth/UIScreen.main.scale 

UIGraphicsBeginImageContextWithOptions(CGSize(width: newWidth, height: newWidth), true, 0) 
+0

Danke für die Antwort, aber ich habe Tabbar Element verwendet, die standardmäßig ihre ImageView verwalten. Ich habe keinen Zugriff darauf und kann daher nicht mit dem Content-Modus von imageView herumspielen. Außerdem, wenn ich das Bild wie von Ihnen vorgeschlagen skaliert bekomme ich ein Bild der Größe 90x90 Blähungen aus der unteren Leiste. – Ishika

+0

@Ishika Sie machen die Berechnungen falsch Wenn es aus der Tableiste imageView bewegt. Wenn Sie einen Skalierungsfaktor von 0,0 anwenden und 30x30 eingeben, haben Sie 60x60 Pixel und 90x90 im 3-fachen Maßstab. Wenn Sie 90x90 eingeben, erhalten Sie 180x180 Pixel oder 270x270 Pixel. Sie müssen es anders herum skalieren, sodass Sie 30 Pixel und nicht 30 Punkte erhalten. Siehe meine bearbeitete Antwort. Sie können die Pixelgröße des Bildes weiterhin mit dieser https://developer.apple.com/documentation/coregraphics/1456148-cgimagegetwidth sehen –

Verwandte Themen