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 19:12:06 -0600
I’ve got more if you need to desaturate an image, remove all color, tint a
bitmap, as opposed to using tint, this actually makes a new tinted bitmap, find
imageInbundle, create enabled and disabled images from source images and so on.
Sometimes we want to use the actual tint, and other times, if we desaturate an
image and then apply a tint when creating a new image, then we have a new image
that is always that way.
This is iOS specific, and you can save them as you want, but I’ve also got a
save in documents folder as a data, not as image and a load image from docs.
Let me know which ones you might want and I can send them to you offlist.
Cheers,
Alex Zavatone
> On Nov 4, 2020, at 5:10 PM, Carl Hoefs <email@hidden> wrote:
>
> Thanks for the UIImage category resizing methods! They are quite useful.
>
> -Carl
>
>> On Nov 4, 2020, at 2:17 PM, Alex Zavatone <email@hidden <mailto:email@hidden>>
>> wrote:
>>
>> 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 <mailto:email@hidden>> wrote:
>>>
>>> On Nov 2, 2020, at 5:59 PM, Carl Hoefs via Cocoa-dev
>>> <email@hidden <mailto: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
>>> <mailto: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
>>> <http://lists.apple.com/>
>>>
>>> Help/Unsubscribe/Update your Subscription:
>>>
>>> This email sent to email@hidden <mailto: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