如何将/assets/image.png转换为byte []?
我尝试过(基于SO上的解决方案):
public void printimage(View view) {
AssetManager assetManager = getAssets();
InputStream inputStream = null;
try {
inputStream = assetManager.open("logo_print.png");
byte[] bytesLogo = IOUtils.toByteArray(inputStream);
int ret = printer.printImage(bytesLogo);
if (ret < 0) {
Toast(context, "printimage fail");
}
Toast(context, "image printed :)");
}
catch (IOException e){
Log.e("message: ", e.getMessage());
Toast(context, "printimage: convert image to Bytes fail");
}
}
printImage - 在包中声明如下:
public class Cprinter {
public native int printImage(byte[] bytes);
}
但是应用程序崩溃了print printimage(),错误是“未找到本机方法:android.pt.Cprinter.printImage:([B] I”
我已将字节转换为字符串(bytesLogo.toString()),每次执行此命令都会返回不同的结果:“[B @ 40d7c798”,“[B @ 40d848e0”,“[B @ 40d59ff0”,&amp;等
目的: 我有一个带内部打印机收据的Android设备。供应商提供了库(libfile.so)和用于开发设备自有软件的示例源。打印简单文本没问题,但打印图像(徽标)时遇到了麻烦。
Here is the vendors` tiny documentation.
p.s:我是Java的新手。
答案 0 :(得分:4)
试试这个
InputStream inputStream = getAssets().open("logo_print.png");
byte[] buffer = new byte[8192];
int bytesRead;
ByteArrayOutputStream output = new ByteArrayOutputStream();
while ((bytesRead = inputStream.read(buffer)) != -1) {
output.write(buffer, 0, bytesRead);
}
byte file[] = output.toByteArray();
字节数组包含
1B 2A n ml mh converted data 1B 4A 00
1B 2A -- begin the block
n - printing mode
a) Q110 support 4 kinds of printing modes,as follow:
n=0x21: 24-point double-density;
n=0x20: 24-point single-density;
n=0x01: 8-point double-density;
n=0x00: 8-point single-density;
b) NXP only support n=0x21: 24-point double-density;
converted data
1B 4A 00 end the block and execute print (print start)
明智的
byte[0] = 0x1B;
byte[1] = 0x2A;
byte[2] = 0x21; // 24-point double-density;
and so on...
答案 1 :(得分:3)
将图像复制到可绘制文件夹中。然后按照以下步骤操作:
Drawable drawable= getResources().getDrawable(R.drawable.image);
将类型转换为BitmapDrawable,
Bitmap bitmap = ((BitmapDrawable)drawable).getBitmap();
ByteArrayOutputStream out = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, out);
byte[] buffer= stream.toByteArray();
您还可以尝试下面的资产文件夹图片代码:
InputStream stream= null;
try {
stream = getAssets().open("fileName.extension");
byte[] fileBytes=new byte[stream.available()];
stream.read(fileBytes);
stream.close();
} catch (IOException e) {
e.printStackTrace();
}
答案 2 :(得分:2)
这适用于资产文件夹中的任何类型的文件
InputStream is = getAssets().open("image.png");
byte[] fileBytes=new byte[is.available()];
is.read( fileBytes);
is.close();
答案 3 :(得分:0)
试试这个:
String timestring = getIntent().getStringExtra("ageintent");
timereceived = Integer.parseInt(timestring);
seekbar.setMax(timereceived);
seekbar.setClickable(false);
timereceived--;
time.setText(String.valueOf(timereceived));
back.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
onBackPressed();
}
});
handler = new Handler();
run = new Runnable() {
@Override
public void run() {
int seconds = Integer.parseInt(timeseconds.getText().toString());
int timechange = Integer.parseInt(time.getText().toString());
seekbar.setProgress(seconds);
seconds--;
timeseconds.setText(String.valueOf(seconds));
if (seconds == 0 && timechange == 0) {
Toast.makeText(Naughty_Step.this, "Your punishment is completed", Toast.LENGTH_SHORT).show();
soundplayer.start();
timereceived--;
} else if (seconds == 0) {
timeseconds.setText("59");
timechange--;
seekbar.setProgress(seconds);
time.setText(String.valueOf(timechange));
// int min= Integer.parseInt(time.getText().toString());
// seekbar.setProgress(min);
handler.postDelayed(this, 1000);
} else {
handler.postDelayed(this, 1000);
}
}
};
handler.postDelayed(run, 1000);
}
this。