2017-03-06 37 views
0

正是我想要相機的功能(如單和批次(每次多張照片))在以下應用:實現拍攝功能像天才掃描相機

https://play.google.com/store/apps/details?id=com.thegrizzlylabs.geniusscan.free&hl=en

我已經成功實施這一點。但是,我的問題是,我已經用SurfaceView實現了這個功能。當我從相機捕捉照片時,與Genius掃描應用程序相比,其模糊。

任何人都可以請讓我知道我到底能夠如何實現這個功能而不會模糊。

注:捕獲多張照片

private void takeImage() { 
     camera.takePicture(null, null, new PictureCallback() { 

      private File imageFile; 

      @Override 
      public void onPictureTaken(byte[] data, Camera camera) { 
       try { 
        // convert byte array into bitmap 
        Bitmap loadedImage = null; 
        Bitmap rotatedBitmap = null; 
        loadedImage = BitmapFactory.decodeByteArray(data, 0, 
          data.length); 

        // rotate Image 
        Matrix rotateMatrix = new Matrix(); 
        rotateMatrix.postRotate(rotation); 
        rotatedBitmap = Bitmap.createBitmap(loadedImage, 0, 0, 
          loadedImage.getWidth(), loadedImage.getHeight(), 
          rotateMatrix, false); 
        String state = Environment.getExternalStorageState(); 
        File folder = null; 
        if (state.contains(Environment.MEDIA_MOUNTED)) { 
         folder = new File(Environment 
           .getExternalStorageDirectory() + "/Demo"); 
        } else { 
         folder = new File(Environment 
           .getExternalStorageDirectory() + "/Demo"); 
        } 

        boolean success = true; 
        if (!folder.exists()) { 
         success = folder.mkdirs(); 
        } 
        if (success) { 
         java.util.Date date = new java.util.Date(); 
         imageFile = new File(folder.getAbsolutePath() 
           + File.separator 
           + new Timestamp(date.getTime()).toString() 
           + "Image.jpg"); 

         imageFile.createNewFile(); 
        } else { 
         Toast.makeText(getBaseContext(), "Image Not saved", 
           Toast.LENGTH_SHORT).show(); 
         return; 
        } 

        ByteArrayOutputStream ostream = new ByteArrayOutputStream(); 

        // save image into gallery 
        rotatedBitmap.compress(CompressFormat.JPEG, 100, ostream); 

        FileOutputStream fout = new FileOutputStream(imageFile); 
        fout.write(ostream.toByteArray()); 
        fout.close(); 
        ContentValues values = new ContentValues(); 

        values.put(Images.Media.DATE_TAKEN, 
          System.currentTimeMillis()); 
        values.put(Images.Media.MIME_TYPE, "image/jpeg"); 
        values.put(MediaStore.MediaColumns.DATA, 
          imageFile.getAbsolutePath()); 

        CameraDemoActivity.this.getContentResolver().insert(
          Images.Media.EXTERNAL_CONTENT_URI, values); 

        if (mSingleView.getVisibility() == View.VISIBLE) { 
         btnDoneClicked(); 
        } else { 

        } 


        mArrayUri.add(Uri.fromFile(imageFile)); 

        if (mBatchView.getVisibility() == View.VISIBLE) { 
         batchClickCount++; 
         mtxtCapturedClicks.setText(String.valueOf(batchClickCount)); 
        } else { 
         batchClickCount = 0; 
         mtxtCapturedClicks.setText(""); 
        } 

       } catch (Exception e) { 
        e.printStackTrace(); 
       } 

      } 
     }); 
    } 
+0

我碰上了一個類似的問題一次。你在'''onActivityResult'''中使用額外的「數據」嗎?如果您看[簡單拍攝照片](https://developer.android.com/training/camera/photobasics.html)教程,那麼額外只是一個縮略圖,您需要在拍攝照片中提供一個文件URI意圖保存完整大小的圖像。 – Haem

回答

0
public static Bitmap scaleBitmap(Bitmap bitmap, int newWidth, int newHeight) { 
    Bitmap scaledBitmap = Bitmap.createBitmap(newWidth, newHeight, Bitmap.Config.ARGB_8888); 

    float scaleX = newWidth/(float) bitmap.getWidth(); 
    float scaleY = newHeight/(float) bitmap.getHeight(); 
    float pivotX = 0; 
    float pivotY = 0; 

    Matrix scaleMatrix = new Matrix(); 
    scaleMatrix.setScale(scaleX, scaleY, pivotX, pivotY); 

    Canvas canvas = new Canvas(scaledBitmap); 
    canvas.setMatrix(scaleMatrix); 
    canvas.drawBitmap(bitmap, 0, 0, new Paint(Paint.FILTER_BITMAP_FLAG)); 

    return scaledBitmap; 
} 

試試這個功能來提高圖像質量