@Override
  public byte[] getMatrix() {
    int width = getWidth();
    int height = getHeight();

    // If the caller asks for the entire underlying image, save the copy and give them the
    // original data. The docs specifically warn that result.length must be ignored.
    if (width == dataWidth && height == dataHeight) {
      return yuvData;
    }

    int area = width * height;
    byte[] matrix = new byte[area];
    int inputOffset = top * dataWidth + left;

    // If the width matches the full width of the underlying data, perform a single copy.
    if (width == dataWidth) {
      System.arraycopy(yuvData, inputOffset, matrix, 0, area);
      return matrix;
    }

    // Otherwise copy one cropped row at a time.
    byte[] yuv = yuvData;
    for (int y = 0; y < height; y++) {
      int outputOffset = y * width;
      System.arraycopy(yuv, inputOffset, matrix, outputOffset, width);
      inputOffset += dataWidth;
    }
    return matrix;
  }
This object extends LuminanceSource around an array of YUV data returned from the camera driver,
with the option to crop to a rectangle within the full data. This can be used to exclude
superfluous pixels around the perimeter and speed up decoding.

It works for any pixel format where the Y channel is planar and appears first, including
YCbCr_420_SP and YCbCr_422_SP.

The code for this class was adapted from the ZXing project: http://code.google.com/p/zxing
OCRTest/src/main/java/edu/sfsu/cs/orange/ocr/PlanarYUVLuminanceSource.java