Blame view

src/com/ectrip/cyt/zxing/camera/PlanarYUVLuminanceSource.java 3.42 KB
3c2353cd   杜方   1、畅游通核销app源码提交;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
  /*
   * Copyright 2009 ZXing authors
   *
   * Licensed under the Apache License, Version 2.0 (the "License");
   * you may not use this file except in compliance with the License.
   * You may obtain a copy of the License at
   *
   *      http://www.apache.org/licenses/LICENSE-2.0
   *
   * Unless required by applicable law or agreed to in writing, software
   * distributed under the License is distributed on an "AS IS" BASIS,
   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   * See the License for the specific language governing permissions and
   * limitations under the License.
   */
  
  package com.ectrip.cyt.zxing.camera;
  
  import com.google.zxing.LuminanceSource;
  
  import android.graphics.Bitmap;
  
  public final class PlanarYUVLuminanceSource extends LuminanceSource {
  	private final byte[] yuvData;
  	private final int dataWidth;
  	private final int dataHeight;
  	private final int left;
  	private final int top;
  
  	public PlanarYUVLuminanceSource(byte[] yuvData, int dataWidth,
  									int dataHeight, int left, int top, int width, int height) {
  		super(width, height);
  
  		if (left + width > dataWidth || top + height > dataHeight) {
  			throw new IllegalArgumentException(
  					"Crop rectangle does not fit within image data.");
  		}
  
  		this.yuvData = yuvData;
  		this.dataWidth = dataWidth;
  		this.dataHeight = dataHeight;
  		this.left = left;
  		this.top = top;
  	}
  
  	@Override
  	public byte[] getRow(int y, byte[] row) {
  		if (y < 0 || y >= getHeight()) {
  			throw new IllegalArgumentException(
  					"Requested row is outside the image: " + y);
  		}
  		int width = getWidth();
  		if (row == null || row.length < width) {
  			row = new byte[width];
  		}
  		int offset = (y + top) * dataWidth + left;
  		System.arraycopy(yuvData, offset, row, 0, width);
  		return row;
  	}
  
  	@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;
  	}
  
  	@Override
  	public boolean isCropSupported() {
  		return true;
  	}
  
  	public int getDataWidth() {
  		return dataWidth;
  	}
  
  	public int getDataHeight() {
  		return dataHeight;
  	}
  
  	public Bitmap renderCroppedGreyscaleBitmap() {
  		int width = getWidth();
  		int height = getHeight();
  		int[] pixels = new int[width * height];
  		byte[] yuv = yuvData;
  		int inputOffset = top * dataWidth + left;
  
  		for (int y = 0; y < height; y++) {
  			int outputOffset = y * width;
  			for (int x = 0; x < width; x++) {
  				int grey = yuv[inputOffset + x] & 0xff;
  				pixels[outputOffset + x] = 0xFF000000 | (grey * 0x00010101);
  			}
  			inputOffset += dataWidth;
  		}
  
  		Bitmap bitmap = Bitmap.createBitmap(width, height,
  				Bitmap.Config.ARGB_8888);
  		bitmap.setPixels(pixels, 0, width, 0, 0, width, height);
  		return bitmap;
  	}
  }