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 > <cocoa-dev@lists.apple.com> wrote: > > On Nov 2, 2020, at 5:59 PM, Carl Hoefs via Cocoa-dev > <cocoa-dev@lists.apple.com> 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 (Cocoa-dev@lists.apple.com) > > 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: > https://lists.apple.com/mailman/options/cocoa-dev/zav%40mac.com > > This email sent to z...@mac.com _______________________________________________ Cocoa-dev mailing list (Cocoa-dev@lists.apple.com) 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: https://lists.apple.com/mailman/options/cocoa-dev/archive%40mail-archive.com This email sent to arch...@mail-archive.com