Friday, January 28, 2022

#1 2021-10-15 05:06:13 pm

Fredrik71
Member
Registered: 2019-10-23
Posts: 929

CILanczosScaleTransform to resize image

I find this code on stackoverflow in Swift, so I made myself the challenge to convert it to ASObjC.

My approach to get theWidth and theHeight from sourceImage is properly not the best way.
The source code of Swift example is included.

The default values for scale and aspectRatio = 1.0

You could see in the log what whose values are.

Change the targetSize of width and height

Applescript:

use framework "Foundation"
use framework "CoreImage"
use scripting additions

(**
* import CoreImage
*
* let context = CIContext()
* let imageURL = URL(fileURLWithPath: "sample.jpg")
* let sourceImage = CIImage(contentsOf: imageURL, options: nil)
* let resizeFilter = CIFilter(name:"CILanczosScaleTransform")!
*
* // Desired output size
* let targetSize = NSSize(width:800, height:600)
*
* // Compute scale and corrective aspect ratio
* let scale = targetSize.height / (sourceImage?.extent.height)!
* let aspectRatio = targetSize.width/((sourceImage?.extent.width)! * scale)
*
* // Apply resizing
* resizeFilter.setValue(sourceImage, forKey: kCIInputImageKey)
* resizeFilter.setValue(scale, forKey: kCIInputScaleKey)
* resizeFilter.setValue(aspectRatio, forKey: kCIInputAspectRatioKey)
* let outputImage = resizeFilter.outputImage
*)


set thePath to POSIX path of (choose file)
set imageURL to current application's |NSURL|'s fileURLWithPath:thePath
set sourceImage to current application's CIImage's imageWithContentsOfURL:imageURL options:(missing value)

set targetSize to current application's NSMakeSize(512, 750)
set {theWidth, theHeight} to {item 1 of item 2 of sourceImage's extent(), item 2 of item 2 of sourceImage's extent()}
set scale to (targetSize's height) / (theHeight)
set aspectRatio to (targetSize's width) / ((theWidth) * scale)
log {scale, aspectRatio}

set resizeFilter to current application's CIFilter's filterWithName:"CILanczosScaleTransform" withInputParameters:{inputImage:sourceImage, inputScale:scale, inputAspectRatio:aspectRatio}
set outputImage to resizeFilter's outputImage()

set imageRep to current application's NSBitmapImageRep's alloc()'s initWithCIImage:outputImage
set imageData to imageRep's TIFFRepresentation()
imageData's writeToFile:(POSIX path of (path to desktop) & "imageSize.tif") atomically:true

We could also use a scale factor with CIImage class with affine transformation matrix.
Reference: https://developer.apple.com/documentati … mmakescale

Applescript:

use framework "Foundation"
use framework "CoreImage"
use scripting additions

property outputImage : POSIX path of (path to desktop) & "imageSize.tif"

set thePath to POSIX path of (choose file)
set imageURL to current application's |NSURL|'s fileURLWithPath:thePath
set sourceImage to current application's CIImage's imageWithContentsOfURL:imageURL options:(missing value)

-- Default scale factor
transformScale(sourceImage, outputImage, 1.0, 1.0)

on transformScale(inputImage, outputImage, scaleFactorSX, scaleFactorSY)
   set inputImage to inputImage's imageByApplyingTransform:(current application's CGAffineTransformMakeScale(scaleFactorSX, scaleFactorSY))
   set imageRep to current application's NSBitmapImageRep's alloc()'s initWithCIImage:inputImage
   set imageData to imageRep's TIFFRepresentation()
   imageData's writeToFile:outputImage atomically:true
end transformScale

Or we could do something like this

Applescript:

use framework "Foundation"
use framework "CoreImage"
use scripting additions

property outputImage : POSIX path of (path to desktop) & "imageSize.tif"

set thePath to POSIX path of (choose file)
set imageURL to current application's |NSURL|'s fileURLWithPath:thePath
set sourceImage to current application's CIImage's imageWithContentsOfURL:imageURL options:(missing value)

applyingOrientation(sourceImage, outputImage, "left")

on applyingOrientation(inputImage, outputImage, imageOrientation)
   if imageOrientation = "up" then
       set inputImage to inputImage's imageByApplyingOrientation:(current application's kCGImagePropertyOrientationUp)
   else if imageOrientation = "down" then
       set inputImage to inputImage's imageByApplyingOrientation:(current application's kCGImagePropertyOrientationDown)
   else if imageOrientation = "left" then
       set inputImage to inputImage's imageByApplyingOrientation:(current application's kCGImagePropertyOrientationLeft)
   else if imageOrientation = "right" then
       set inputImage to inputImage's imageByApplyingOrientation:(current application's kCGImagePropertyOrientationRight)
   end if
   set imageRep to current application's NSBitmapImageRep's alloc()'s initWithCIImage:inputImage
   set imageData to imageRep's TIFFRepresentation()
   imageData's writeToFile:outputImage atomically:true
end applyingOrientation

More useful to have handlers for other projects.

Applescript:

use framework "Foundation"
use framework "CoreImage"
use scripting additions

property outputImage : POSIX path of (path to desktop) & "imageSize.tif"

set thePath to POSIX path of (choose file)
set imageURL to current application's |NSURL|'s fileURLWithPath:thePath
set sourceCIImage to current application's CIImage's imageWithContentsOfURL:imageURL options:(missing value)

set theCIImage to applyingOrientation(sourceCIImage, "up")
saveTIFFFromCIImage(theCIImage, outputImage)

(**
* [applyingOrientation(inputCIImage, imageOrientation)]
**
* imageOrientation: up, down, left and right, with mirror: upM,downM,leftM and rightM
*)

on applyingOrientation(inputCIImage, imageOrientation)
   if imageOrientation = "up" then
       set inputImage to inputCIImage's imageByApplyingOrientation:(current application's kCGImagePropertyOrientationUp)
   else if imageOrientation = "down" then
       set inputImage to inputCIImage's imageByApplyingOrientation:(current application's kCGImagePropertyOrientationDown)
   else if imageOrientation = "left" then
       set inputImage to inputCIImage's imageByApplyingOrientation:(current application's kCGImagePropertyOrientationLeft)
   else if imageOrientation = "right" then
       set inputImage to inputCIImage's imageByApplyingOrientation:(current application's kCGImagePropertyOrientationRight)
   else if imageOrientation = "upM" then
       set inputImage to inputCIImage's imageByApplyingOrientation:(current application's kCGImagePropertyOrientationUpMirrored)
   else if imageOrientation = "downM" then
       set inputImage to inputCIImage's imageByApplyingOrientation:(current application's kCGImagePropertyOrientationDownMirrored)
   else if imageOrientation = "leftM" then
       set inputImage to inputCIImage's imageByApplyingOrientation:(current application's kCGImagePropertyOrientationLeftMirrored)
   else if imageOrientation = "rightM" then
       set inputImage to inputCIImage's imageByApplyingOrientation:(current application's kCGImagePropertyOrientationRightMirrored)
   end if
   return inputImage
end applyingOrientation

(**
* [saveTIFFFromCIImage(inputCIImage, outputImageTIFF)]
*)

on saveTIFFFromCIImage(inputCIImage, outputImageTIFF)
   set imageRep to current application's NSBitmapImageRep's alloc()'s initWithCIImage:inputCIImage
   set imageData to imageRep's TIFFRepresentation()
   imageData's writeToFile:outputImageTIFF atomically:true
end saveTIFFFromCIImage

Last edited by Fredrik71 (2021-10-16 04:40:09 am)


if you are the expert, who will you call if its not your imagination.

Offline

 

Board footer

Powered by FluxBB

RSS (new topics) RSS (active topics)