将/assets/image.png转换为byte []

时间:2016-03-24 11:01:42

标签: java android shared-libraries

如何将/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的新手。

4 个答案:

答案 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