2017-08-11 1 views
1

J'ai une véritable question. J'ai utilisé l'algorithme suivant pour le redimensionnement et le partage d'image.Comment enregistrer/partager une image réduite sans être floue

func resizeImageWith(newSize: CGSize) -> UIImage { 

    let horizontalRatio = newSize.width/size.width 
    let verticalRatio = newSize.height/size.height 

    let ratio = max(horizontalRatio, verticalRatio) 
    let newSize = CGSize(width: size.width * ratio, height: size.height * ratio) 
    UIGraphicsBeginImageContextWithOptions(newSize, true, 0) 
    draw(in: CGRect(origin: CGPoint(x: 0, y: 0), size: newSize)) 
    let newImage = UIGraphicsGetImageFromCurrentImageContext() 
    UIGraphicsEndImageContext() 
    return newImage! 
} 


func shareImageToSM(image : UIImage) { 

    let imageToShare = [ image ] 

    let activityVC = UIActivityViewController(activityItems: imageToShare, applicationActivities: nil) 

    //New Excluded Activities Code 
    if #available(iOS 9.0, *) { 
     activityVC.excludedActivityTypes = [UIActivityType.airDrop, UIActivityType.addToReadingList, UIActivityType.openInIBooks] 
    } else { 
     activityVC.excludedActivityTypes = [UIActivityType.airDrop, UIActivityType.addToReadingList] 
    } 
    // 

    activityVC.popoverPresentationController?.sourceView = self.view 
    self.present(activityVC, animated: true, completion: nil) 
} 


Il redimensionne l'image correctement. Comme si elle redimensionnait mon image 600x600 en 150x150 Mais lorsque j'essaie de sauvegarder ou de partager cette image réduite, elle obtient la même taille que celle de l'image réelle mais devient floue. S'il vous plaît voir les images suivantes. Actual image size and dimensions

ci-dessus est la taille réelle de l'image et les dimensions de 600x600 Resized image size and dimensions

Et ce l'image redimensionnée (150x150) qui est enregistré/partagé.
Je veux que cette image soit enregistrée/partagée en dimension 150x150 mais avec une qualité de pixel plus élevée comme l'image suivante. S'il vous plaît aidez-moi, c'est un problème grave et un mal de tête pour moi. enter image description here

+0

Pouvez-vous publier votre code pour partager? –

+0

done @ReinierMelian J'utilise UIActivityViewController pour le partage/l'enregistrement d'images. –

+0

La partie importante de votre code (la sauvegarde) est manquante, n'est-ce pas? – Trilarion

Répondre

0
enum ImageQuality:CGFloat { 
    case iq_50 = 50, iq_100 = 100 ,iq_320 = 320, iq_480 = 480 , iq_640 = 640 , iq_720 = 720 , iq_1024 = 1024 
} 
static func scaleImage(sourceImage: UIImage, imageQuality:ImageQuality) -> UIImage{ 
    let finalSize:CGSize = getNewsize(sourceSize: sourceImage.size, targetSize: imageQuality.rawValue) 
    UIGraphicsBeginImageContextWithOptions(finalSize, false, 0) 
    sourceImage.draw(in: CGRect(origin: .zero, size: finalSize)) 
    let newImage = UIGraphicsGetImageFromCurrentImageContext()! 
    UIGraphicsEndImageContext() 
    return newImage 
} 
static func getNewsize(sourceSize:CGSize, targetSize:CGFloat) -> CGSize{ 
    let width: CGFloat = sourceSize.width 
    let height: CGFloat = sourceSize.height 
    var scaleFactor: CGFloat = 0.0 
    var scaledWidth: CGFloat = targetSize 
    var scaledHeight: CGFloat = targetSize 

    let widthFactor: CGFloat = targetSize/width 
    let heightFactor: CGFloat = targetSize/height 

    if widthFactor > heightFactor { 
     scaleFactor = widthFactor 
    } 
    else { 
     scaleFactor = heightFactor 
    } 
    scaledWidth = width * scaleFactor 
    scaledHeight = height * scaleFactor 
    return CGSize(width: scaledWidth, height: scaledHeight) 
} 
+0

Vaneet Vous utilisez presque le même code source que j'ai utilisé. Vous venez d'ajouter une fonction pour calculer la nouvelle taille de l'image mise à l'échelle. Mon problème n'est pas avec la taille de l'image, mon problème est pourquoi il est enregistré/affiché une image de flou? C'est comme enregistrer une image 150x150 sur une toile de 600x600. Cela devrait également réduire la taille de la toile à 150x150. –