华域联盟 Andriod Android 实现图片转二进制流及二进制转字符串

Android 实现图片转二进制流及二进制转字符串

我就废话不多说了,还是直接看代码吧

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();
}

// 二进制转字符串
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();
}

补充知识:图片(bitmap)转化为byte[],并上传到服务器

压缩为3:1bitmap

/**
   * 压缩bitmap
   *
   * @param bitmap
   * @return
   */
  private Bitmap compressBitmap(Bitmap bitmap) {
    // 创建操作图片用的matrix对象
    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; //默认返回 false
}
}
});
writeTabletDialog.show();
}
/**
* 将InputStream转换成byte数组
* <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格式存储的方法
*/
private void saveBmp(Bitmap bitmap) {
if (bitmap == null)
return;
// 位图大小
int nBmpWidth = bitmap.getWidth();
int nBmpHeight = bitmap.getHeight();
int DataSizePerLine = 40;
// 图像数据大小
int bufferSize = nBmpHeight * DataSizePerLine;
try {
// 存储文件名
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);
// 调色板
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) {
// 创建操作图片用的matrix对象
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 实现图片转二进制流及二进制转字符串就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持华域联盟。

本文由 华域联盟 原创撰写:华域联盟 » Android 实现图片转二进制流及二进制转字符串

转载请保留出处和原文链接:https://www.cnhackhy.com/108266.htm

本文来自网络,不代表华域联盟立场,转载请注明出处。

作者: sterben

发表回复

联系我们

联系我们

2551209778

在线咨询: QQ交谈

邮箱: [email protected]

工作时间:周一至周五,9:00-17:30,节假日休息

关注微信
微信扫一扫关注我们

微信扫一扫关注我们