Post

Replies

Boosts

Views

Activity

What is the correct way to get a RAW files image size
According to the Core Image documents the following API should return the RAW images native output size. let filter = CIFilter(imageURL: url, options: nil) let value = filter.value(forKey: CIRAWFilterOption.outputNativeSize.rawValue ) as? CIVector However this seems to always return the camera's native resolution rather than the actual image size contained in the RAW file. For example if I uses this API on a RAW file that was shot at 16:9 aspect ratio on a Sony 19 the image size should be 6000 x 3376 but this API call returns 6000 x 4000. Is this a bug or am I missing something - is there another API call to get the actual image size ? Note that the EXIF data does contain the correct image size.
1
0
976
May ’21
How to set a custom preview image for SwiftUI Drag and Drop on macOS
Is it possible to change the drag and drop preview image. I am currently using the following code but the imagePreviewHandler never gets called and the image is always just a rendering of the visible portion of the gridView ... grid .drag(if: isDraggable, data: {                         return self.dragData()                     }) ...     func dragData()-NSItemProvider{                  let itemProvider = NSItemProvider(object: fileService )                  itemProvider.previewImageHandler = { (handler, _, _) - Void in             os_log("previewImageHandler called")             if let image = NSImage(named: "film") {                 handler?(image as NSSecureCoding?, nil)             } else {                 let error = NSError(domain:"", code:001, userInfo:[ NSLocalizedDescriptionKey: "Unable to create preview image"])                 handler?(nil, error)             }         }         return itemProvider     } struct Draggable: ViewModifier {     let condition: Bool     let data: () - NSItemProvider     @ViewBuilder     func body(content: Content) - some View {         if condition {             content.onDrag(data)         } else {             content         }     } } extension View {     public func drag(if condition: Bool, data: @escaping () - NSItemProvider) - some View {         self.modifier(Draggable(condition: condition, data: data))     } }
1
0
1.7k
Apr ’21
How can I extract the data from the output image of CIAreaHistogramFilter
I would like to get arrays of red, green and blue histogram data from the output of the CIAreaHistogramFilter. My current approach is not working. According to the docs CIAreaHistogramFilter returns an image with width = bin size (256) in my case and height = 1 so each pixel contains the count of the rgb values for that bin. if let areahistogram = self.areaHistogramFilter(ciImage) { let attrs = [kCVPixelBufferCGImageCompatibilityKey: kCFBooleanTrue, kCVPixelBufferCGBitmapContextCompatibilityKey: kCFBooleanTrue] as CFDictionary var pixelBuffer : CVPixelBuffer? let status = CVPixelBufferCreate(kCFAllocatorDefault, Int(areahistogram.extent.size.width), Int(areahistogram.extent.size.height), kCVPixelFormatType_32ARGB, attrs, &pixelBuffer) guard (status == kCVReturnSuccess) else { return } self.hContext.render(areahistogram, to: pixelBuffer!) CVPixelBufferLockBaseAddress(pixelBuffer!, CVPixelBufferLockFlags(rawValue: 0)); let int32Buffer = unsafeBitCast(CVPixelBufferGetBaseAddress(pixelBuffer!), to: UnsafeMutablePointerUInt32.self) let int32PerRow = CVPixelBufferGetBytesPerRow(pixelBuffer!) var data = [Int]() for i in 0..256 { /* Get BGRA value for pixels */ let BGRA = int32Buffer[i] data.append(Int(BGRA)) let red = (BGRA 16) & 0xFF; let green = (BGRA 8) & 0xFF; let blue = BGRA & 0xFF; os_log("data[\(i)]:\(BGRA) red: \(red) green: \(green) blue: \(blue)") } CVPixelBufferUnlockBaseAddress(pixelBuffer!, CVPixelBufferLockFlags(rawValue: 0)) } results in zeros. data[0]:0 red: 0 green: 0 blue: 0 data[1]:0 red: 0 green: 0 blue: 0 ... data[255]:134678783 red: 7 green: 7 blue: 7 similarly produces a bunch of zeros or this let baseAddress = CVPixelBufferGetBaseAddress(pixelBuffer!) let buffer = baseAddress!.assumingMemoryBound(to: UInt8.self) for i in stride(from: 0, to: 256*4, by: 4) { let blue = buffer[i] let green = buffer[i+1] let red = buffer[i+2] os_log("data[\(i)]: red: \(red) green: \(green) blue: \(blue)") } or this variation that seems simpler var red = [UInt8]()             var green = [UInt8]()             var blue = [UInt8]()             for i in 0..256 {                 // Get BGRA value for pixel                 let BGRA = int32Buffer[i]                 withUnsafeBytes(of: BGRA.bigEndian) {                     red.append($0[0])                     green.append($0[1])                     blue.append($0[2])                 }         }
2
0
1.7k
Apr ’21
How do I implement NSAttributedStringValueTransformer for attributed strings stored in Core Data
I have an application that uses a Transformable property in Core Data to store NSAttributedStrings and get compiler warnings Object.property is using a nil or insecure value transformer. Please switch to NSSecureUnarchiveFromDataTransformerName or a custom NSValueTransformer subclass of NSSecureUnarchiveFromDataTransformer [2] NSSecureUnarchiveFromDataTransformerName does not support archiving and unarchiving of NSAttributedStrings and so as I understand it I have to create a custom transformer, register that in AppDelegate and enter the transformer class name in the Core Data models object property details. Below is the custom transformer class, however I get an error when trying to decode existing attributed strings. Can anyone shed any light on this ? Why is the new unarchiver unable to handle the NSFileWrapper given this is a property of the NSTextAttachment and works fine with the deprecated unarchiver ? Is this a bug or intentional ? Is there some way to add support for unarchiving the NSFileWrapper ? @implementation NSAttributedStringValueTransformer(Class)transformedValueClass { return [NSAttributedString class]; }(void)initialize { [NSValueTransformer setValueTransformer:[[self alloc]init] forName:@"NSAttributedStringValueTransformer"]; } (BOOL)allowsReverseTransformation { return YES; } (NSData*)transformedValue:(NSAttributedString*)value { NSError *error; NSData* stringAsData = [NSKeyedArchiver archivedDataWithRootObject:value requiringSecureCoding:false error:&error]; if (error != nil) { NSLog(@"Error encoding attributed string: %@", error.localizedDescription); return nil; } return stringAsData; } (NSAttributedString*)reverseTransformedValue:(NSData*)value { NSError *error; /* This works */ /* NSAttributedString* string = [NSKeyedUnarchiver unarchiveObjectWithData: value]; / /* This fails with the error The data couldn’t be read because it isn’t in the correct format. */ NSAttributedString* string = [NSKeyedUnarchiver unarchivedObjectOfClass:[NSAttributedString class] fromData:value error:&error]; if (error != nil) { NSLog(@"Error decoding attributed string: %@", error); return nil; } return string; } @end Resulting Error: Error decoding attributed string: [Error](https://developer.apple.com/forums/content/attachment/547d2a08-9220-42aa-9d29-1b3129feb864){: .log-attachment} Error Domain=NSCocoaErrorDomain Code=4864 "value for key 'NSFileWrapper' was of unexpected class 'NSFileWrapper (0x1c9d40d48) [/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/System/Library/Frameworks/Foundation.framework]'. Allowed classes are '{( "NSURL (0x1c9d1b988) [/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/System/Library/Frameworks/CoreFoundation.framework]", "NSAttributedString (0x1c9d36668) [/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/System/Library/Frameworks/Foundation.framework]", "NSFont (0x1c9e1a3c8) [/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/System/Library/PrivateFrameworks/UIFoundation.framework]", "NSDictionary (0x1c9d1adf8) [/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/System/Library/Frameworks/CoreFoundation.framework]", "NSArray (0x1c9d1ab28) [/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/System/Library/Frameworks/CoreFoundation.framework]", "NSColor (0x1c9ec2198) [/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/System/Library/PrivateFrameworks/UIKitCore.framework]", "NSTextAttachment (0x1c9e1aad0) [/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/System/Library/PrivateFrameworks/UIFoundation.framework]", "NSGlyphInfo (0x1c9e198d8) [/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/System/Library/PrivateFrameworks/UIFoundation.framework]", ...
3
0
1.8k
Apr ’21
SwiftUI Toolbar
Any reason the .toolbar modifier doesn't work in macOS 11 beta? Is there some global setting required in the app to enable this as no toolbar is being shown at all.
1
0
1.1k
Jun ’20