Without touching the broader question of bitmap formats:

> On Mar 15, 2017, at 12:01 PM, Nevin Brackett-Rozinsky via swift-users 
> <swift-users@swift.org> wrote:
> 
> Also, for my specific application, I need to take an array of floating point 
> numbers and say, “Hey, the underlying bits that make up the IEEE-754 
> representation of these numbers are exactly the bits that I want to use for 
> the colors of the pixels.” I do not know how to do that in Swift.
> 
> In C I would malloc a buffer, write to it as (float*), then pass it to a 
> function which takes (char*) and saves a PNG. Thus there is only one 
> allocation, the buffer is filled with float values, and the exact bit-pattern 
> is interpreted as RGBA pixels.
> 
> How can I do the equivalent in Swift?

Create and fill an Array<Float> (actually, a ContiguousArray<Float> would be a 
little better for this use) with your data. Then use `withUnsafeBytes` to 
access the raw bytes as an `UnsafeRawBufferPointer`, a type which behaves sort 
of like a fixed-size array of `UInt8`.

You could access the bytes one at at time by looping (or indexing, or doing 
many other things):

        myFloats.withUnsafeBytes { buffer in
                for byte in buffer {
                        putchar(byte)
                }
        }

Or you can pull out the start pointer and count and use them:

        myFloats.withUnsafeBytes { buffer in
                guard write(fd, buffer.baseAddress, buffer.count) != -1 else { 
throw MyError.IOError(errno) }
        }
                
Or you can copy it into a `Data` or `Array` and return it to the outer context:

        let bytes = myFloats.withUnsafeBytes { buffer in
                return Data(buffer: buffer)     // or Array(buffer)
        }

One thing you should *not* do is hold on to `buffer` or its `baseAddress` 
beyond the closing bracket. Once `withUnsafeBytes` returns, the `Array` or 
`ContiguousArray` is free to move or delete its data, so you can no longer 
depend on the pointer to be correct. Copy the data to an `Array` or `Data`, or 
allocate and copy it to your own `UnsafeRawBufferPointer`, if you want to hold 
on to it longer.

-- 
Brent Royal-Gordon
Architechies

_______________________________________________
swift-users mailing list
swift-users@swift.org
https://lists.swift.org/mailman/listinfo/swift-users

Reply via email to