2016-06-23 11 views
4

Ich habe eine CGSize Objekte, die ich an meinen Server senden muss. Die maximale Größe, die ich an den Server senden kann, ist 900 * 900 (900 Breite/900 Höhe).Resize CGSize auf das Maximum mit dem Seitenverhältnis

Es gibt einige Objekte, die größer sind die 900 * 900 und ich möchte eine Funktion schreiben, die sie auf das Maximum ändert (wie ich bereits sage, das Maximum ist 900 * 900), aber das Seitenverhältnis zu halten.

Zum Beispiel: Wenn ich ein Objekt habe, das 1000px Breite und 1000px Höhe ist, möchte ich, dass die Funktion ein 900 * 900 Objekt zurückgibt. Wenn ich ein Objekt mit einer Breite von 1920px und einer Höhe von 1080pX habe, möchte ich, dass es die maximal mögliche Größe zurückgibt, wobei das Verhältnis beibehalten wird.

Jeder hat eine Idee, wie kann ich das tun?

Vielen Dank!

OriginalUser2 Antwort:

Ich habe diesen Code versucht:

let aspect = CGSizeMake(900, 900) 
let rect = CGRectMake(0, 0, 1920, 1080) 

let final = AVMakeRectWithAspectRatioInsideRect(aspect, rect) 

final ist {x 420 y 0 w 1,080 h 1,080}, kann ich nicht verstehen, warum die x = 420, aber trotzdem 1080*1080 nicht im selben Seitenverhältnis als 1920*1080 und es ist größer als 900*900.

Können Sie etwas mehr erklären?

+1

Werfen Sie einen Blick auf [ 'AVMakeRectWithAspectRatioInsideRect'] (https://developer.apple .com/Bibliothek/ios/documentation/AVFoundation/Referenz/AVFoundation_Functions/# // apple_ref/c/func/AVMakeRectWithAspectRatioInsideRect) – Hamish

+0

@ originaluser2 Ich brauche es nicht in eine 'CGRect' passen, nur um die maximale Größe –

+0

zu erhalten Sicher, also gib 'CGPointZero' für den Ursprung ein und verlass die Größe – Hamish

Antwort

4

Wie ich in meinem Kommentar gesagt habe, können Sie die AVMakeRectWithAspectRatioInsideRect Funktion aus dem AVFounation Framework verwenden, um dies zu tun.

Das Problem mit Ihrem Code ist, dass die Werte falsch herum sind. Der boundingRect: Parameter sollte der richtige sein, um Ihre Größe innerhalb zu passen - und die aspectRatio: sollte die Originalgröße sein, die Sie skalieren möchten, während das Seitenverhältnis beibehalten wird.

Zum Beispiel:

import AVFoundation 

// original size 
let aspect = CGSize(width: 1920, height: 1080) 

// rect to fit that size within, while maintaining its aspect ratio, 
// in this case you don't care about fitting inside a rect, so pass (0, 0) for the origin 
let rect = CGRect(x: 0, y: 0, width: 900, height: 900) 

// aspect fitted size, in this case (900.0, 506.25) 
let final = AVMakeRectWithAspectRatioInsideRect(aspect, rect).size 

(beachten Sie, dass die Funktion AVMakeRect(aspectRatio:insideRect:) in Swift 3 umbenannt wurde)

+0

ändern zu * AVKit importieren - das ist genial – n13

+0

@ n13 Ich sehe 'AVMakeRect (aspectRatio: insideRect:)' in der [AVKit Dokumentation] (https://developer.apple.com/reference/avkit) - nur als Teil von [AVFoundation-Funktionen] (https://developer.apple.com/reference/avfoundation/2009810-avfoundation_functions). – Hamish

+0

^Du hast Recht. Ich benutze AVKit importieren, weil AVFoundation erschien mit einem Durchgestrichen, als ob es veraltet war (was es nicht ist, nur überprüft). Entfernte AVKit und es funktioniert immer noch. XCode 8/Schnell 3. – n13

1

Dieser Code stark reduziert und kann geändert werden, aber aus Gründen der Klarheit:

if myImage.width == myImage.height { 
    // New image will be 900px by 900px 
    newImage.width = (900/myImage.width) * myImage.width 
    newImage.height = (900/myImage.height) * myImage.height 
} else if myImage.width > myImage.height { 
    // New image will have width of 900px 
    newImage.width = (900/myImage.width) * myImage.width 
    newImage.height = (900/myImage.width) * myImage.height 
} else { 
    // New Image will have height of 900px 
    newImage.width = (900/myImage.height) * myImage.width 
    newImage.height = (900/myImage.height) * myImage.height 
} 

In diesem Snippet ist 900 die maximale Breite und Höhe des skalierte Bildes, aber dieser Wert kann mit einem variablen abstrahieren für jeden Wert, den Sie möchten.

+0

Das Problem ist, dass ich nicht die Bildgröße habe, passiere ich 'PHImageManagerMaximumSize', also muss ich zuerst das vollständige Bild holen und dann die benötigte Größe dafür holen und wieder holen? –

+0

Zunächst müssen Sie das in Ihrer Frage angeben.Zweitens bin ich mir nicht sicher, was du meinst; Könnten Sie diesen Code nicht verwenden, nachdem Sie das Bild ursprünglich abgerufen haben? –

+0

Oh, Entschuldigung. Ich meine, dass ich 'fetchImage (asset: size:)' verwende, also muss ich die Größe im fortgeschrittenen geben. In der Methode, die Sie auf Ihren Kommentar geschrieben haben, muss ich die volle Größe des Bildes wissen. Also muss ich das Bild in voller Größe holen, um Ihre Methode aufzurufen und eine neue 'CGSize' zu ​​erhalten und das Bild dann mit der neuen Größe erneut zu holen? –