画像をbyte
2829 ワード
public byte[] StartBmpToPrintCode(Bitmap bitmap) {
byte temp = 0;
int j = 7;
int start = 0;
if (bitmap != null) {
int mWidth = bitmap.getWidth();
int mHeight = bitmap.getHeight();
int[] mIntArray = new int[mWidth * mHeight];
byte[] data = new byte[mWidth * mHeight];
bitmap.getPixels(mIntArray, 0, mWidth, 0, 0, mWidth, mHeight);
encodeYUV420SP(data, mIntArray, mWidth, mHeight);
byte[] result = new byte[mWidth * mHeight / 8];
for (int i = 0; i < mWidth * mHeight; i++) {
temp = (byte) ((byte) (data[i] << j) + temp);
j--;
if (j < 0) {
j = 7;
}
if (i % 8 == 7) {
result[(start++)] = temp;
temp = 0;
}
}
if (j != 7) {
result[(start++)] = temp;
}
int aHeight = 24 - mHeight % 24;
int perline = mWidth / 8;
byte[] add = new byte[aHeight * perline];
byte[] nresult = new byte[mWidth * mHeight / 8 + aHeight * perline];
System.arraycopy(result, 0, nresult, 0, result.length);
System.arraycopy(add, 0, nresult, result.length, add.length);
byte[] byteContent = new byte[(mWidth / 8 + 4) * (mHeight + aHeight)];
byte[] bytehead = new byte[4];
bytehead[0] = 31;
bytehead[1] = 16;
bytehead[2] = (byte) (mWidth / 8);
bytehead[3] = 0;
for (int index = 0; index < mHeight + aHeight; index++) {
System.arraycopy(bytehead, 0, byteContent, index * (perline + 4), 4);
System.arraycopy(nresult, index * perline, byteContent, index * (perline + 4) + 4, perline);
}
return byteContent;
}
return null;
}
// byte
public void encodeYUV420SP(byte[] yuv420sp, int[] rgba, int width, int height) {
int frameSize = width * height;
int[] U = new int[frameSize];
int[] V = new int[frameSize];
int uvwidth = width / 2;
int bits = 8;
int index = 0;
int f = 0;
for (int j = 0; j < height; j++) {
for (int i = 0; i < width; i++) {
int r = (rgba[index] & 0xFF000000) >> 24;
int g = (rgba[index] & 0xFF0000) >> 16;
int b = (rgba[index] & 0xFF00) >> 8;
int y = (66 * r + 129 * g + 25 * b + 128 >> 8) + 16;
int u = (-38 * r - 74 * g + 112 * b + 128 >> 8) + 128;
int v = (112 * r - 94 * g - 18 * b + 128 >> 8) + 128;
byte temp = (byte) (y > 255 ? 255 : y < 0 ? 0 : y);
yuv420sp[(index++)] = (byte) (temp > 0 ? 1 : 0);
}
}
f = 0;
}