Re: Getting immutable UIImage data pointer without copy?
Re: Getting immutable UIImage data pointer without copy?
- Subject: Re: Getting immutable UIImage data pointer without copy?
- From: Quincey Morris <email@hidden>
- Date: Tue, 14 Nov 2017 20:08:42 -0800
(resent to the list)
On Nov 14, 2017, at 18:36 , Rick Mann <email@hidden
<mailto:email@hidden>> 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?
_______________________________________________
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