It is not exactly 3 bytes per pixel. To be exact, for each pixel there is Y,U and V component, but U and V information is "shared" between groups of 4 pixels
If your preview image is, for instance, W=12 H=8, the array will have (in this order)
Y Y Y Y Y Y Y Y Y Y Y Y
Y Y Y Y Y Y Y Y Y Y Y Y
Y Y Y Y Y Y Y Y Y Y Y Y
Y Y Y Y Y Y Y Y Y Y Y Y
Y Y Y Y Y Y Y Y Y Y Y Y
Y Y Y Y Y Y Y Y Y Y Y Y
Y Y Y Y Y Y Y Y Y Y Y Y
Y Y Y Y Y Y Y Y Y Y Y Y
V U V U V U V U V U V U
V U V U V U V U V U V U
V U V U V U V U V U V U
V U V U V U V U V U V U
( 1.5*12*8 bytes = 144 bytes)
The V,U components are shared between more than one Y. For instance the first V,U pair is the chroma information for array[0],array[1],array[12] and array[13]. But in your case you don't need them, so can take directly the first W*H bytes
About the resolution, each device has a set of allowed preview resolutions and a set of allowed picture resolutions. If you want to process it in real-time, you only need to set the preview size. I would use the minimum one which is enough for your needs, or just subsample the array given in the preview event at N points each row and col.