2011-12-22 101 views
1

所以我在看這個線程如何保存圖片上的重疊。 Android save view to jpg or png保存重疊圖像

我有我的代碼拍照和保存圖像就像該線程中的答案建議。問題在於它只保存黑色背景的疊加層。拍攝的實際圖片不是圖像的一部分。這裏是我的代碼:

package com.commonsware.android.skeleton; 

import android.app.Activity; 
import android.content.Context; 
import android.content.Intent; 
import android.graphics.Bitmap; 
import android.graphics.Bitmap.CompressFormat; 
import android.hardware.Camera; 
import android.hardware.Camera.*; 
import android.net.Uri; 
import android.os.Bundle; 
import android.os.Environment; 
import android.util.Log; 
import android.view.Display; 
import android.view.Surface; 
import android.view.SurfaceHolder; 
import android.view.SurfaceView; 
import android.view.View; 
import android.view.Window; 
import android.view.WindowManager; 
import android.widget.FrameLayout; 

import java.io.File; 
import java.io.FileNotFoundException; 
import java.io.FileOutputStream; 
import java.io.IOException; 
import java.util.List; 

// ---------------------------------------------------------------------- 

public class SimpleBulbActivity extends Activity { 
    private Preview mPreview; 
    private static final String TAG = "CameraDemo"; 
    FrameLayout preview; 
    Camera mCamera; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     // Hide the window title. 
     requestWindowFeature(Window.FEATURE_NO_TITLE); 
     // create a File object for the parent directory 
     File imageDirectory = new File(Environment.getExternalStorageDirectory() + "/SimpleBulb/"); 
     // Check if the directory exists 
     if(!imageDirectory.exists()) { 
      // have the object build the directory structure, if needed. 
      imageDirectory.mkdirs(); 
     } 
     setContentView(R.layout.main); 
    } 

    protected void onResume() { 
     super.onResume(); 
     //Setup the FrameLayout with the Camera Preview Screen 
     mPreview = new Preview(this); 
     preview = (FrameLayout)findViewById(R.id.preview); 
     preview.addView(mPreview); 
    } 

    public void snap(View view) { 
     mCamera.takePicture(shutterCallback, rawCallback, jpegCallback); 
    } 
    ShutterCallback shutterCallback = new ShutterCallback() { 
     public void onShutter() { 
      Log.d(TAG, "onShutter'd"); 
     } 
    }; 

    PictureCallback rawCallback = new PictureCallback() { 
     public void onPictureTaken(byte[] _data, Camera _camera) { 
      Log.d(TAG, "onPictureTaken - raw"); 
     } 
    }; 

    PictureCallback jpegCallback = new PictureCallback() { 
     public void onPictureTaken(byte[] data, Camera _camera) { 
      FileOutputStream outStream = null; 
      try { 
       // write to local sandbox file system 
       // outStream = 
       // CameraDemo.this.openFileOutput(String.format("%d.jpg", 
       // System.currentTimeMillis()), 0); 
       // Or write to sdcard 
       FrameLayout view = (FrameLayout)findViewById(R.id.image); 
       view.setDrawingCacheEnabled(true); 
       Bitmap b = view.getDrawingCache(); 
       b.compress(CompressFormat.PNG, 95, new FileOutputStream(Environment.getExternalStorageDirectory() + String.format(
         "/SimpleBulb/%d.png", System.currentTimeMillis()))); 
       /*outStream = new FileOutputStream(Environment.getExternalStorageDirectory() + String.format(
         "/SimpleBulb/%d.jpeg", System.currentTimeMillis())); 
       sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED, Uri.parse("file://"+ Environment.getExternalStorageDirectory()))); 
       outStream.write(data); 
       outStream.close();*/ 
       Log.d(TAG, "onPictureTaken - wrote bytes: " + data.length); 
      } catch (FileNotFoundException e) { 
       e.printStackTrace(); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } finally { 
      } 
      Log.d(TAG, "onPictureTaken - jpeg"); 
     } 
    }; 

// ---------------------------------------------------------------------- 

    class Preview extends SurfaceView implements SurfaceHolder.Callback { 
     SurfaceHolder mHolder; 

     Preview(Context context) { 
      super(context); 

      // Install a SurfaceHolder.Callback so we get notified when the 
      // underlying surface is created and destroyed. 
      mHolder = getHolder(); 
      mHolder.addCallback(this); 
      mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); 
     } 

     public void surfaceCreated(SurfaceHolder holder) { 
      // The Surface has been created, acquire the camera and tell it where 
      // to draw. 
      mCamera = Camera.open(); 
      try { 
       mCamera.setPreviewDisplay(holder); 
       mCamera.setPreviewCallback(new PreviewCallback() { 

       public void onPreviewFrame(byte[] data, Camera arg1) { 
        FileOutputStream outStream = null; 
        try { 
         outStream = new FileOutputStream(Environment.getExternalStorageDirectory().toString()); 
         outStream.write(data); 
         outStream.close(); 
         Log.d(TAG, "onPreviewFrame - wrote bytes: " 
           + data.length); 
        } catch (FileNotFoundException e) { 
         e.printStackTrace(); 
        } catch (IOException e) { 
         e.printStackTrace(); 
        } finally { 
        } 
        Preview.this.invalidate(); 
       } 
      }); 
     } catch (IOException e) { 
       mCamera.release(); 
       mCamera = null; 
       e.printStackTrace(); 
      } 
     } 

     public void surfaceDestroyed(SurfaceHolder holder) { 
      // Surface will be destroyed when we return, so stop the preview. 
      // Because the CameraDevice object is not a shared resource, it's very 
      // important to release it when the activity is paused. 
      mCamera.stopPreview(); 
      mCamera.release(); 
      mCamera = null; 
     } 


     private Size getOptimalPreviewSize(List<Size> sizes, int w, int h) { 
      final double ASPECT_TOLERANCE = 0.05; 
      double targetRatio = (double) w/h; 
      if (sizes == null) return null; 

      Size optimalSize = null; 
      double minDiff = Double.MAX_VALUE; 

      int targetHeight = h; 

      // Try to find an size match aspect ratio and size 
      for (Size size : sizes) { 
       double ratio = (double) size.width/size.height; 
       if (Math.abs(ratio - targetRatio) > ASPECT_TOLERANCE) continue; 
       if (Math.abs(size.height - targetHeight) < minDiff) { 
        optimalSize = size; 
        minDiff = Math.abs(size.height - targetHeight); 
       } 
      } 

      // Cannot find the one match the aspect ratio, ignore the requirement 
      if (optimalSize == null) { 
       minDiff = Double.MAX_VALUE; 
       for (Size size : sizes) { 
        if (Math.abs(size.height - targetHeight) < minDiff) { 
         optimalSize = size; 
         minDiff = Math.abs(size.height - targetHeight); 
        } 
       } 
      } 
      return optimalSize; 
     } 

     public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) { 
      // Now that the size is known, set up the camera parameters and begin 
      // the preview. 
      Camera.Parameters parameters = mCamera.getParameters(); 

      List<Size> sizes = parameters.getSupportedPreviewSizes(); 
      Size optimalSize = getOptimalPreviewSize(sizes, w, h); 

      Display display = ((WindowManager)getSystemService(WINDOW_SERVICE)).getDefaultDisplay(); 

      if(display.getRotation() == Surface.ROTATION_0) 
      { 
       parameters.setPreviewSize(optimalSize.height, optimalSize.width);       
       mCamera.setDisplayOrientation(90); 
      } 

      if(display.getRotation() == Surface.ROTATION_90) 
      { 
       parameters.setPreviewSize(optimalSize.width, optimalSize.height);       
      } 

      if(display.getRotation() == Surface.ROTATION_180) 
      { 
       parameters.setPreviewSize(optimalSize.width, optimalSize.height);    
      } 

      if(display.getRotation() == Surface.ROTATION_270) 
      { 
       parameters.setPreviewSize(optimalSize.width, optimalSize.height); 
       mCamera.setDisplayOrientation(0); 
      } 

      mCamera.setParameters(parameters); 
      mCamera.startPreview(); 
     } 

    } 

} 

這裏是我的佈局:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" android:layout_width="fill_parent" 
    android:layout_height="fill_parent" android:id="@+id/layout"> 
    <TextView android:layout_width="fill_parent" 
     android:layout_height="wrap_content" android:text="SimpleBulb Vision" 
     android:textSize="24sp" /> 

    <FrameLayout android:id="@+id/image" android:layout_weight="1" android:layout_width="fill_parent" 
     android:layout_height="fill_parent"> 

    <FrameLayout android:id="@+id/preview" 
     android:layout_weight="1" android:layout_width="fill_parent" 
     android:layout_height="fill_parent"> 
    </FrameLayout> 

    <ImageView android:id="@+id/bulb" android:src="@drawable/litbulb" 
        android:layout_width="match_parent" 
        android:layout_height="112dip" /> 

    </FrameLayout> 

    <Button android:layout_width="match_parent" 
     android:layout_height="wrap_content" android:id="@+id/buttonClick" 
     android:text="Snap!" android:layout_gravity="center" android:onClick="snap"></Button> 

</LinearLayout> 
+0

請有任何幫助! – 2011-12-22 21:12:04

+0

這個鏈接可以幫助http://stackoverflow.com/questions/22476683/save-camerapreview-with-overlay-image – rsc 2014-04-20 07:39:37

回答

0

我非常高興地說,我想通了這一點。由於某些原因,getDrawingCache()不會抓取拍攝的圖像。於是我將圖像保存在SD卡上,將圖像放回到視圖中,然後使用上述方法將它們保存爲一個。這很好,雖然由於壓縮圖像兩次而損失了一些質量。如果有人需要密碼,請隨時向我發送消息。

+0

威廉:我需要捕獲覆蓋圖像的代碼。你會送我嗎? – Ram 2013-04-02 12:14:15

+0

@Willem你可以請與我分享代碼?謝謝:) – Beginner 2013-06-06 06:23:02

+0

@ user2143817我不再有代碼。但是,這個原則非常簡單。 – 2013-06-06 13:35:22