Android 實(shí)現(xiàn)圖片轉(zhuǎn)二進(jìn)制流及二進(jìn)制轉(zhuǎn)字符串
我就廢話不多說了,還是直接看代碼吧
public static byte[] readStream(String imagepath) throws Exception {
FileInputStream fs = new FileInputStream(imagepath);
ByteArrayOutputStream outStream = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int len = 0;
while (-1 != (len = fs.read(buffer))) {
outStream.write(buffer, 0, len);
}
outStream.close();
fs.close();
return outStream.toByteArray();
}
// 二進(jìn)制轉(zhuǎn)字符串
public static String byte2hex(byte[] b)
{
StringBuffer sb = new StringBuffer();
String tmp = "";
for (int i = 0; i < b.length; i++) {
tmp = Integer.toHexString(b[i] & 0XFF);
if (tmp.length() == 1){
sb.append("0" + tmp);
}else{
sb.append(tmp);
}
}
return sb.toString();
}
補(bǔ)充知識(shí):圖片(bitmap)轉(zhuǎn)化為byte[],并上傳到服務(wù)器
壓縮為3:1bitmap
/**
* 壓縮bitmap
*
* @param bitmap
* @return
*/
private Bitmap compressBitmap(Bitmap bitmap) {
// 創(chuàng)建操作圖片用的matrix對(duì)象
Matrix matrix = new Matrix();
matrix.postScale((float) 300 / bitmap.getWidth(),
(float) 100 / bitmap.getHeight());
Log.e("", "bitmap_width" + bitmap.getWidth());
Log.e("", "bitmap_height" + bitmap.getHeight());
Bitmap compressBitmap = Bitmap.createBitmap(bitmap, 0, 0,
bitmap.getWidth(), bitmap.getHeight(), matrix, true);
return compressBitmap;
}
上傳壓縮后的bitmap
private void eleSignature() {
WritePadDialog writeTabletDialog = new WritePadDialog(
this, new DialogListener() {
public void refreshActivity(Object object) {
Bitmap mSignBitmap = (Bitmap) object;
mSignBitmap = compressBitmap(mSignBitmap);
// Bitmap newsrcImage = mSignBitmap.copy(Bitmap.Config.RGB_565, true);
saveBmp(mSignBitmap);
Log.e("", "after bitmap_width:" + mSignBitmap.getWidth());
Log.e("", "after bitmap_height:" + mSignBitmap.getHeight());
File file = new File(file_name);
Log.e("Jeny", "file.exists():" + file.exists());
if (!file.exists()) {
return;
}
byte[] eleSignatureData = null;
try {
eleSignatureData = InputStreamTOByte();
} catch (IOException e) {
}
Log.e("Jeny", "eleSignatureData:" + eleSignatureData.length);
if (eleSignatureData == null) {
return;
}
// byte[] eleSignatureData = InputStreamTOByte();
// byte[] eleSignatureData = Bitmap2Bytes(newsrcImage);
mController.startSavingElecSignatureDataOfSDPay(SalesCollectActivity.this, voucherNo, eleSignatureData);
mSignBitmap.recycle();
}
}
);
writeTabletDialog.setCanceledOnTouchOutside(false);
writeTabletDialog.setOnKeyListener(new DialogInterface.OnKeyListener() {
@Override
public boolean onKey(DialogInterface dialogInterface, int keyCode, KeyEvent keyEvent) {
if (keyCode == KeyEvent.KEYCODE_BACK) {
return true;
} else {
return false; //默認(rèn)返回 false
}
}
});
writeTabletDialog.show();
}
/**
* 將InputStream轉(zhuǎn)換成byte數(shù)組
* <p/>
* InputStream
*
* @return byte[]
* @throws IOException
*/
@SuppressWarnings("resource")
public byte[] InputStreamTOByte() throws IOException {
File file = new File(file_name);
if (!file.exists()) {
return null;
}
FileInputStream is = new FileInputStream(file_name);
ByteArrayOutputStream outStream = new ByteArrayOutputStream();
byte[] data = new byte[BUFFER_SIZE];
int count = -1;
while ((count = is.read(data, 0, BUFFER_SIZE)) != -1)
outStream.write(data, 0, count);
// data = null;
byte[] alldata = outStream.toByteArray();
/**top = new byte[62];
for (int i = 0; i < 62; i++)
{
top[i] = alldata[i];
}
writefile(top_name, top);
*/
// byte[] other = new byte[alldata.length - 62];
// for (int i = 0; i < (alldata.length - 62); i++)
// {
// other[i] = alldata[i + 62];
// }
/*
* String b =
* Environment.getExternalStorageDirectory().getPath()+"/other.txt";
* writefile(b, other);
*/
return alldata;
}
/**
* @param bitmap 圖片以bmp格式存儲(chǔ)的方法
*/
private void saveBmp(Bitmap bitmap) {
if (bitmap == null)
return;
// 位圖大小
int nBmpWidth = bitmap.getWidth();
int nBmpHeight = bitmap.getHeight();
int DataSizePerLine = 40;
// 圖像數(shù)據(jù)大小
int bufferSize = nBmpHeight * DataSizePerLine;
try {
// 存儲(chǔ)文件名
File file = new File(file_name);
Log.i("SurFace", "filename:" + file_name);
if (!file.exists()) {
file.createNewFile();
}
FileOutputStream fileos = new FileOutputStream(file_name);
// bmp文件頭
int bfType = 0x4d42;
long bfSize = 14 + 40 + 8 + bufferSize;
int bfReserved1 = 0;
int bfReserved2 = 0;
long bfOffBits = 14 + 40 + 8;
// 保存bmp文件頭
writeWord(fileos, bfType);
writeDword(fileos, bfSize);
writeWord(fileos, bfReserved1);
writeWord(fileos, bfReserved2);
writeDword(fileos, bfOffBits);
// bmp信息頭
long biSize = 40L;
long biWidth = nBmpWidth;
long biHeight = nBmpHeight;
int biPlanes = 1;
int biBitCount = 1;
long biCompression = 0L;
long biSizeImage = 0L;
long biXpelsPerMeter = 0L;
long biYPelsPerMeter = 0L;
long biClrUsed = 0L;
long biClrImportant = 0L;
// 保存bmp信息頭
writeDword(fileos, biSize);
writeLong(fileos, biWidth);
writeLong(fileos, biHeight);
writeWord(fileos, biPlanes);
writeWord(fileos, biBitCount);
writeDword(fileos, biCompression);
writeDword(fileos, biSizeImage);
writeLong(fileos, biXpelsPerMeter);
writeLong(fileos, biYPelsPerMeter);
writeDword(fileos, biClrUsed);
writeDword(fileos, biClrImportant);
// 調(diào)色板
byte[] c = new byte[4];
c[0] = 0;
c[1] = 0;
c[2] = 0;
c[3] = 0;
fileos.write(c);
byte[] w = new byte[4];
w[0] = (byte) 255;
w[1] = (byte) 255;
w[2] = (byte) 255;
w[3] = 0;
fileos.write(w);
int wWidth = DataSizePerLine;
// 像素掃描
byte bmpData[] = new byte[bufferSize];
for (int ibuf = 0; ibuf < bufferSize; ibuf++)
bmpData[ibuf] = (byte) 0xff;
int iByte = 0;
int iCount = 0;
byte bPix = 0;
for (int nCol = nBmpHeight - 1, nRealCol = nBmpHeight; nCol > 0; nCol--, nRealCol--) {
wWidth = DataSizePerLine;
iCount = 0;
iByte = 0;
for (int wRow = 0; wRow < nBmpWidth; wRow++) {
int clr = bitmap.getPixel(wRow, nCol);
int r = (clr | 0xff00ffff) >> 16 & 0x00ff;
int g = Color.green(clr);
int b = Color.blue(clr);
// byte a = (byte) Color.blue(clr);
// byte b = (byte) Color.green(clr);
// byte d = (byte) Color.red(clr);
// System.out.println("r:"+r);
if (r != 255 || g != 255 || b != 255)// 黑色
{
// bPix = (byte)(bPix & (0x7f>>iByte |
// 0x7f<<(8-iByte)));
bPix = (byte) (bPix & ~(byte) Math.pow(2, iByte));
// System.out.println( " 黑色 " + bPix );
} else {
// bPix = (byte)(bPix & (0xff>>iByte |
// 0xff<<(8-iByte)));
bPix = (byte) (bPix | (byte) Math.pow(2, iByte));
// System.out.println( " 白色 " + bPix);
}
if (iCount != 0 && iCount % 8 == 0) {
bmpData[nRealCol * wWidth - wRow / 8] = bPix;
iByte = 0;
} else {
iByte++;
}
iCount++;
/*
* //if(a==b && b==d && a>0) if (nRealCol%2 == 0) { //為白色
* bmpData[nRealCol * wWidth] = (byte)255; }else{ //為黑色
* bmpData[nRealCol * wWidth] = 0; }
*/
// Arrays.fill(x, value);
/*
* bmpData[nRealCol * wWidth + wByteIdex] = (byte) Color .b;
* bmpData[nRealCol * wWidth + wByteIdex + 1] = (byte) Color
* .green(clr); bmpData[nRealCol * wWidth + wByteIdex + 2] =
* (byte) Color .red(clr);
*/
}
}
// System.out.println( " iCount= " + iCount);
/*
* byte[] writeByte = new byte[bmpData.length]; for(int
* i=0;i<writeByte.length;i++){ writeByte[i] =
* bmpData[bmpData.length-i-1]; }
*/
fileos.write(bmpData);
fileos.flush();
fileos.close();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
protected void writeWord(FileOutputStream stream, int value)
throws IOException {
byte[] b = new byte[2];
b[0] = (byte) (value & 0xff);
b[1] = (byte) (value >> 8 & 0xff);
stream.write(b);
}
protected void writeDword(FileOutputStream stream, long value)
throws IOException {
byte[] b = new byte[4];
b[0] = (byte) (value & 0xff);
b[1] = (byte) (value >> 8 & 0xff);
b[2] = (byte) (value >> 16 & 0xff);
b[3] = (byte) (value >> 24 & 0xff);
stream.write(b);
}
protected void writeLong(FileOutputStream stream, long value)
throws IOException {
byte[] b = new byte[4];
b[0] = (byte) (value & 0xff);
b[1] = (byte) (value >> 8 & 0xff);
b[2] = (byte) (value >> 16 & 0xff);
b[3] = (byte) (value >> 24 & 0xff);
stream.write(b);
}
/**
* 壓縮bitmap
*
* @param bitmap
* @return
*/
private Bitmap compressBitmap(Bitmap bitmap) {
// 創(chuàng)建操作圖片用的matrix對(duì)象
Matrix matrix = new Matrix();
matrix.postScale((float) 300 / bitmap.getWidth(),
(float) 100 / bitmap.getHeight());
Log.e("", "bitmap_width" + bitmap.getWidth());
Log.e("", "bitmap_height" + bitmap.getHeight());
Bitmap compressBitmap = Bitmap.createBitmap(bitmap, 0, 0,
bitmap.getWidth(), bitmap.getHeight(), matrix, true);
return compressBitmap;
}
以上這篇Android 實(shí)現(xiàn)圖片轉(zhuǎn)二進(jìn)制流及二進(jìn)制轉(zhuǎn)字符串就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Android TextView跑馬燈效果實(shí)現(xiàn)方法
這篇文章主要介紹了Android TextView跑馬燈效果實(shí)現(xiàn)方法,涉及Android布局文件中相關(guān)屬性的設(shè)置技巧,非常簡(jiǎn)單實(shí)用,需要的朋友可以參考下2016-01-01
安卓 獲取手機(jī)IP地址的實(shí)現(xiàn)代碼
本篇文章主要介紹 Android 4.0 獲取手機(jī)IP地址的方法,附有實(shí)現(xiàn)代碼,具有參考價(jià)值,希望對(duì)有需要的小伙伴有幫助2016-07-07
Android進(jìn)階NestedScroll嵌套滑動(dòng)機(jī)制實(shí)現(xiàn)吸頂效果詳解
這篇文章主要為大家介紹了Android進(jìn)階NestedScroll嵌套滑動(dòng)機(jī)制實(shí)現(xiàn)吸頂效果詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-01-01
android:照片涂畫功能實(shí)現(xiàn)過程及原理詳解
這篇文章主要介紹了android:照片涂畫功能實(shí)現(xiàn)過程及原理,需要的朋友可以參考下2014-02-02
Android應(yīng)用開發(fā)中自定義ViewGroup的究極攻略
這里我們要演示的自定義ViewGroup中將實(shí)現(xiàn)多種方式排列和滑動(dòng)等效果,并且涵蓋子View之間Touch Event的攔截與處理等問題,完全干貨,下面就為大家送上Android應(yīng)用開發(fā)中自定義ViewGroup的究極實(shí)例攻略2016-05-05
Android?shape與selector標(biāo)簽使用詳解
Android中提供一種xml的方式,讓我們可以自由地定義背景,比較常用的就是shape標(biāo)簽和selector標(biāo)簽,這篇文章主要介紹了Android?shape與selector標(biāo)簽使用,需要的朋友可以參考下2022-05-05
Kotlin開發(fā)中與if等價(jià)的takeIf與takeUnless詳解
這篇文章主要介紹了Kotlin開發(fā)中與if等價(jià)的takeIf與takeUnless使用,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧2023-01-01
Android開發(fā)Jetpack組件Room用例講解
這篇文章主要為大家介紹了Android?Jetpack組件Room的使用案例的詳細(xì)講解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步2022-02-02

