Thanks a lot for your response!

I have tried the CILanczosScaleTransform filter for downsizing. I have computed 
the scale factor exactly such that the new image has an extent not larger than 
the view.
(Below is my code)
But the performance was worse, at least with the software renderer.
With the hardware renderer (kCIContextUseSoftwareRenderer: @NO), performance 
was as before, but visual artifacts were still much worse than without any 
downsizing.

If you are curious: here is a video showing the performance 

  https://owncloud.informatik.uni-bremen.de/index.php/s/wJRkK8Ek2HTp32a

(The video was made with the software renderer.)


So, right now, I am using this code:

    NSDictionary * imageOpts = @{ 
(id)kCGImageSourceCreateThumbnailWithTransform: (id)kCFBooleanTrue,  // takes 
care of EXIF orientation, too
                                  
(id)kCGImageSourceCreateThumbnailFromImageIfAbsent: (id)kCFBooleanTrue,
                                  
(id)kCGImageSourceCreateThumbnailFromImageAlways: (id)kCFBooleanTrue,
                                  (id)kCGImageSourceShouldCacheImmediately: 
(id)kCFBooleanTrue,
                                  (id)kCGImageSourceThumbnailMaxPixelSize: 
@(8192)                               };
    CGImageRef newImageRef = CGImageSourceCreateThumbnailAtIndex( new_image, 0, 
      
                                                               (__bridge 
CFDictionaryRef) imageOpts );

There is still a bit of stuttering.


Maybe, it would help to create the CALayer for the new images in the background 
thread and add it to the layer hierarchy, but I haven't explored this option 
yet.
Maybe it would not help, because, maybe, at that point some process in the 
foreground would kick in again, over which I would not have control.


Best regards, Gabriel



Encl.:
Just for your reference, this is my code for downsizing using the Lanczos 
filter:

    CIContext * ciContext = [CIContext contextWithOptions: 
@{kCIContextUseSoftwareRenderer: @NO} ];           // TODO: als inst.var. 
machen!
    // TODO: evtl im context kCIContextPriorityRequestLow und 
useSoftwareRenderer=FALSE angeben?
    CIFilter * resizeFilter = [CIFilter filterWithName: 
@"CILanczosScaleTransform" ];
    [resizeFilter setValue: orientedimage forKey: kCIInputImageKey];
    [resizeFilter setValue: @(scale) forKey: kCIInputScaleKey ];
    [resizeFilter setValue: @(aspect) forKey:kCIInputAspectRatioKey ];
    CIImage * resizedImage = resizeFilter.outputImage;
    CGImageRef newImageRef = [ciContext createCGImage: resizedImage fromRect: 
resizedImage.extent]; 


> 
> Since this stutter does not occur when cycling back through images that have 
> already been assigned to the layer, it’s possible that if the size of the 
> CGImageRef does not match the size of the CALayer, there may be some kind of 
> render occuring, especially if the image is being scaled to fit the layer.  
> Do images much larger than the CALayer stutter more? 
> 
> Also, if you’re resizing, you’ll want to use CIImage’s 
> CILanczosScaleTransform filter. Simply scaling a using a transform will give 
> you a much blurrier image.
> 
> 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/archive%40mail-archive.com

This email sent to arch...@mail-archive.com

Reply via email to