Re: Scaling a UIImage
Re: Scaling a UIImage
- Subject: Re: Scaling a UIImage
- From: Alex Zavatone via Cocoa-dev <email@hidden>
- Date: Wed, 4 Nov 2020 16:17:22 -0600
Sorry for the delay. I hope these do what you need.
Of course you’ll need to add checks to make sure that you’re not dividing by
zero or nil.
// Alex Zavatone 4/2/16.
+ (UIImage *)imageWithImage:(UIImage *)image scaledToHeight:(CGFloat)newHeight
{
CGFloat ratio = newHeight / image.size.height;
CGFloat newWidth = image.size.width * ratio;
CGSize newSize = CGSizeMake(newWidth, newHeight);
//UIGraphicsBeginImageContext(newSize);
// In next line, pass 0.0 to use the current device's pixel scaling factor
(and thus account for Retina resolution).
// Pass 1.0 to force exact pixel size.
UIGraphicsBeginImageContextWithOptions(newSize, NO, 0.0);
[image drawInRect:CGRectMake(0, 0, newWidth, newHeight)];
UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return newImage;
}
+ (UIImage *)imageWithImage:(UIImage *)image scaledToSize:(CGSize)newSize
{
//UIGraphicsBeginImageContext(newSize);
// In next line, pass 0.0 to use the current device's pixel scaling factor
(and thus account for Retina resolution).
// Pass 1.0 to force exact pixel size.
UIGraphicsBeginImageContextWithOptions(newSize, NO, 0.0);
[image drawInRect:CGRectMake(0, 0, newSize.width, newSize.height)];
UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return newImage;
}
+ (UIImage *)imageWithImage:(UIImage *)image
scaledToPercentage:(CGFloat)newScale
{
CGSize newSize = CGSizeMake(image.size.width * newScale, image.size.width *
newScale);
UIImage *newImage = [self imageWithImage:image scaledToSize:newSize];
return newImage;
}
Cheers,
Alex Zavatone
> On Nov 3, 2020, at 10:34 AM, James Crate via Cocoa-dev
> <email@hidden> wrote:
>
> On Nov 2, 2020, at 5:59 PM, Carl Hoefs via Cocoa-dev
> <email@hidden> wrote:
>
>> I have an iOS app that interacts with a macOS server process. The iOS app
>> takes a 3264x2448 camera image, scales it to 640x480 pixels, and makes a
>> JPEG representation of it to send to the server:
>
> I have code that does pretty much the same thing, in Swift though so you’ll
> need to convert the API calls to ObjC. Since you’re taking a picture, you
> could use the AVCapturePhoto directly.
>
>
> let capture : AVCapturePhoto
> private lazy var context = CIContext()
>
> lazy var remotePreviewImage: Data? = {
> guard let cgImage =
> self.capture.cgImageRepresentation()?.takeRetainedValue() else { return nil }
>
> var baseImg = CIImage(cgImage: cgImage)
>
> if let orientation = self.capture.metadata[
> String(kCGImagePropertyOrientation) ] as? Int32 {
> baseImg = baseImg.oriented(forExifOrientation: orientation)
> }
>
> let scalePct = [800.0 / baseImg.extent.size.width, 800.0 /
> baseImg.extent.size.height].max() ?? 0.3
> let transformedImg = baseImg.transformed(by: CGAffineTransform(scaleX:
> scalePct, y: scalePct))
> print("generated remote preview image \(transformedImg.extent.size)")
>
> let colorspace : CGColorSpace = baseImg.colorSpace ??
> CGColorSpace(name: CGColorSpace.sRGB)!
> let compressionKey = CIImageRepresentationOption(rawValue:
> kCGImageDestinationLossyCompressionQuality as String)
> let data = self.context.jpegRepresentation(of: transformedImg,
> colorSpace: colorspace,
> options: [compressionKey :
> 0.6])
> print("photo generated preview \(data?.count ?? 0) bytes")
> return data
> }()
>
>
> I had a previous version that used ImageIO. I don’t remember why I switched
> but I still had the commented code hanging around.
>
> // lazy var remotePreviewImage: Data? = {
> // guard let data = self.capture.fileDataRepresentation() else {
> return nil }
> // guard let src = CGImageSourceCreateWithData(data as NSData, nil)
> else { return nil }
> // let thumbOpts = [
> // kCGImageSourceCreateThumbnailFromImageAlways: true,
> // kCGImageSourceCreateThumbnailWithTransform: true,
> // kCGImageSourceThumbnailMaxPixelSize: 800,
> // ] as [CFString : Any]
> //
> // if let cgImage = CGImageSourceCreateThumbnailAtIndex(src, 0,
> thumbOpts as CFDictionary) {
> // // create jpg data
> // let data = NSMutableData()
> //
> // if let dest = CGImageDestinationCreateWithData(data,
> kUTTypeJPEG, 1, nil) {
> // CGImageDestinationAddImage(dest, cgImage,
> [kCGImageDestinationLossyCompressionQuality: 0.6] as CFDictionary)
> // CGImageDestinationFinalize(dest)
> // }
> // print("getPhoto generated preview \(data.count) bytes for
> RemoteCapture")
> // return data as Data
> // }
> // return nil
> // }()
>
>
> Jim Crate
>
> _______________________________________________
>
> Cocoa-dev mailing list (email@hidden)
>
> Please do not post admin requests or moderator comments to the list.
> Contact the moderators at cocoa-dev-admins(at)lists.apple.com
>
> Help/Unsubscribe/Update your Subscription:
>
> This email sent to email@hidden
_______________________________________________
Cocoa-dev mailing list (email@hidden)
Please do not post admin requests or moderator comments to the list.
Contact the moderators at cocoa-dev-admins(at)lists.apple.com
Help/Unsubscribe/Update your Subscription:
This email sent to email@hidden