> 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