> On Nov 14, 2017, at 20:07 , Quincey Morris 
> <quinceymor...@rivergatesoftware.com> wrote:
> 
> On Nov 14, 2017, at 18:36 , Rick Mann <rm...@latencyzero.com> wrote:
>> 
>> Is there a way to get at the underlying raw image data for a given UIImage 
>> (in an immutable buffer) in Swift?
>> 
>> Does this end up making copies? (For bonus points, what's the array magic?)
>> 
>> let img: UIImage = UIImage(named: "MyImage")
>> let data: CFData? = img.CGImage.dataProvider.data
>> let dataArray: [UInt8] = <some Swift magic to see this as [UInt8]>
> 
> There are some simple answers, but the correct answer is “it depends”. For 
> example, you can do this:
> 
>> var data = Data ([1,2,3,4])
>> print (data [3])
> 
> In other words, seeing a Data instance as an array of bytes is simple. Or, if 
> you want to do something more like the old days in Obj-C, you can do this:
> 
>> data.withUnsafeBytes {
>>     (bytes: UnsafePointer<UInt8>) in
>>     print (bytes [3])
>> }
> 
> which (in some sense) gives you a raw-ish pointer to the underlying data, 
> inside the closure. (The latter, which a different generic specialization 
> type, is also what you’d use if you wanted to access pairs of bytes as UInt16 
> values, etc.)
> 
> Back to original problem, the following code in a playground works:
> 
>> let img = UIImage(named: "Image”)! // I used a PNG image so the data is 
>> simple
>> let data = img.cgImage!.dataProvider!.data! as Data
>> print (data [0], data [1], data [2], data [3])
> 
> The last part of this is (a) whether you can always get the raw data as 
> bytes, (b) what those bytes represent, and (c) does this kind of approach 
> make a copy? The answer is “I don’t know”, because it’s going to depend on 
> the format of the image and the particular data provider. AFAIK, both the 
> array treatment and the UnsafePointer treatment require a continuous 
> underlying buffer, so if the data provide build the data using multiple 
> partial buffers, I suppose there has to be a copy to meet the API semantics.
> 
> You could also iterate through a Data object using a for loop (and general 
> collection/sequence methods as required). Since that would access only 1 byte 
> at a time, I’d expect there’s no copy involved, but who knows what the 
> performance might be in general.
> 
> Does any of that help?

Maybe, at least for the bonus question. The bigger question is around the copy.


-- 
Rick Mann
rm...@latencyzero.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

Reply via email to