简体   繁体   中英

How to get BinaryBitmap from imageView

I want to decode QR code which was set into imageView. I tried the following code.

    BitmapDrawable drawable = (BitmapDrawable) imageView.getDrawable();
    Bitmap bitmap = drawable.getBitmap();

    QRCodeReader reader = new QRCodeReader();
    Result result = reader.decode(bitmap);

but it says it wants BinaryBitmap instead of Bitmap. What should I do?

Thanks in advance.

You could use this class MultiFormatReader from ZXing library.

Bitmap bMap = [...];
String contents = null;

int[] intArray = new int[bMap.getWidth()*bMap.getHeight()];  
//copy pixel data from the Bitmap into the 'intArray' array  
bMap.getPixels(intArray, 0, bMap.getWidth(), 0, 0, bMap.getWidth(), bMap.getHeight());  

LuminanceSource source = new RGBLuminanceSource(bMap.getWidth(), bMap.getHeight(), intArray);
BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(source));

Reader reader = new MultiFormatReader();
Result result = reader.decode(bitmap);
contents = result.getText();

I think it refers to the fact that you need to pass the byte64 converted image ( bitmap to string of bytes)

You can do this like this :

private String bitmapToBase64(Bitmap bitmap) {
   ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
   bitmap.compress(Bitmap.CompressFormat.PNG, 100, byteArrayOutputStream);
   byte[] byteArray = byteArrayOutputStream .toByteArray();
   return Base64.encodeToString(byteArray, Base64.DEFAULT);
}

After that if you need back the bitmap from the byte array you can reverse the process like this :

private Bitmap base64ToBitmap(String b64) {
   byte[] imageAsBytes = Base64.decode(b64.getBytes(), Base64.DEFAULT);
   return BitmapFactory.decodeByteArray(imageAsBytes, 0, imageAsBytes.length);
}
add library to app.gradle

compile 'com.google.zxing:core:3.2.1'
compile 'com.journeyapps:zxing-android-embedded:3.2.0@aar'

    In the MainActivity use following code 

        public class MainActivity extends AppCompatActivity {
          ImageView imageView;
          Button button;
          Button btnScan;
          EditText editText;
          String EditTextValue ;
          Thread thread ;
          public final static int QRcodeWidth = 350 ;
          Bitmap bitmap ;

          TextView tv_qr_readTxt;

         @Override
         protected void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
          setContentView(R.layout.activity_main);

            imageView = (ImageView)findViewById(R.id.imageView);
            editText = (EditText)findViewById(R.id.editText);
            button = (Button)findViewById(R.id.button);
            btnScan = (Button)findViewById(R.id.btnScan);
             tv_qr_readTxt = (TextView) findViewById(R.id.tv_qr_readTxt);

        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {



                if(!editText.getText().toString().isEmpty()){
                    EditTextValue = editText.getText().toString();

                    try {
                        bitmap = TextToImageEncode(EditTextValue);

                        imageView.setImageBitmap(bitmap);

                    } catch (WriterException e) {
                        e.printStackTrace();
                    }
                }
                else{
                    editText.requestFocus();
                    Toast.makeText(MainActivity.this, "Please Enter Your Scanned Test" , Toast.LENGTH_LONG).show();
                }

              }
          });


        btnScan.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

                IntentIntegrator integrator = new IntentIntegrator(MainActivity.this);
                integrator.setDesiredBarcodeFormats(IntentIntegrator.ALL_CODE_TYPES);
                integrator.setPrompt("Scan");
                integrator.setCameraId(0);
                integrator.setBeepEnabled(false);
                integrator.setBarcodeImageEnabled(false);
                integrator.initiateScan();

             }
           });
            }


         Bitmap TextToImageEncode(String Value) throws WriterException {
           BitMatrix bitMatrix;
            try {
            bitMatrix = new MultiFormatWriter().encode(
                    Value,
                    BarcodeFormat.DATA_MATRIX.QR_CODE,
                    QRcodeWidth, QRcodeWidth, null
            );

            } catch (IllegalArgumentException Illegalargumentexception) {

             return null;
           }
          int bitMatrixWidth = bitMatrix.getWidth();

          int bitMatrixHeight = bitMatrix.getHeight();

          int[] pixels = new int[bitMatrixWidth * bitMatrixHeight];

          for (int y = 0; y < bitMatrixHeight; y++) {
              int offset = y * bitMatrixWidth;

             for (int x = 0; x < bitMatrixWidth; x++) {

                 pixels[offset + x] = bitMatrix.get(x, y) ?
                        getResources().getColor(R.color.QRCodeBlackColor):getResources().getColor(R.color.QRCodeWhiteColor);
              }
            }
            Bitmap bitmap = Bitmap.createBitmap(bitMatrixWidth, bitMatrixHeight, Bitmap.Config.ARGB_4444);

           bitmap.setPixels(pixels, 0, 350, 0, 0, bitMatrixWidth, bitMatrixHeight);
           return bitmap;
        }




          @Override
          protected void onActivityResult(int requestCode, int resultCode, Intent data) {
            IntentResult result = IntentIntegrator.parseActivityResult(requestCode, resultCode, data);
          if(result != null) {
            if(result.getContents() == null) {
                Log.e("Scan*******", "Cancelled scan");

             } else {
                Log.e("Scan", "Scanned");

                tv_qr_readTxt.setText(result.getContents());
                Toast.makeText(this, "Scanned: " + result.getContents(), Toast.LENGTH_LONG).show();
             }
          } else {
              // This is important, otherwise the result will not be passed to the fragment
            super.onActivityResult(requestCode, resultCode, data);
             }
           }
         }

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM