合并两张图片并保存到SD卡

时间:2011-12-23 02:18:26

标签: android

我正在使用合并两个image的代码,并在canvas中将它们显示在一起,如下所示。你能说store作为single image

public class ChoosePictureComposite extends Activity implements OnClickListener {

    static final int PICKED_ONE = 0;
    static final int PICKED_TWO = 1;

    boolean onePicked = false;
    boolean twoPicked = false;

    Button choosePicture1, choosePicture2;
    ImageView compositeImageView;

    Bitmap bmp1, bmp2;
    Canvas canvas;
    Paint paint;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        compositeImageView = (ImageView) this
                .findViewById(R.id.CompositeImageView);

        choosePicture1 = (Button) this.findViewById(R.id.ChoosePictureButton1);
        choosePicture2 = (Button) this.findViewById(R.id.ChoosePictureButton2);

        choosePicture1.setOnClickListener(this);
        choosePicture2.setOnClickListener(this);
    }

    public void onClick(View v) {

        int which = -1;

        if (v == choosePicture1) {
            which = PICKED_ONE;
        } else if (v == choosePicture2) {
            which = PICKED_TWO;
        }

        Intent choosePictureIntent = new Intent(Intent.ACTION_PICK,
                android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
        startActivityForResult(choosePictureIntent, which);
    }

    protected void onActivityResult(int requestCode, int resultCode,
            Intent intent) {
        super.onActivityResult(requestCode, resultCode, intent);

        if (resultCode == RESULT_OK) {
            Uri imageFileUri = intent.getData();

            if (requestCode == PICKED_ONE) {
                bmp1 = loadBitmap(imageFileUri);
                onePicked = true;
            } else if (requestCode == PICKED_TWO) {
                bmp2 = loadBitmap(imageFileUri);
                twoPicked = true;
            }

            if (onePicked && twoPicked) {
                Bitmap drawingBitmap = Bitmap.createBitmap(bmp1.getWidth(),
                        bmp1.getHeight(), bmp1.getConfig());
                canvas = new Canvas(drawingBitmap);
                paint = new Paint();
                canvas.drawBitmap(bmp1, 90, 0, paint);
            //  paint.setXfermode(new PorterDuffXfermode(
                    //  android.graphics.PorterDuff.Mode.MULTIPLY));
                canvas.drawBitmap(bmp2, 30, 40, paint);


                 compositeImageView.setImageBitmap(drawingBitmap);
            }
        }
    }

    private Bitmap loadBitmap(Uri imageFileUri) {
        Display currentDisplay = getWindowManager().getDefaultDisplay();

        float dw = currentDisplay.getWidth();
        float dh = currentDisplay.getHeight();

        Bitmap returnBmp = Bitmap.createBitmap((int) dw, (int) dh,
                Bitmap.Config.ARGB_4444);

        try {
            // Load up the image's dimensions not the image itself
            BitmapFactory.Options bmpFactoryOptions = new BitmapFactory.Options();
            bmpFactoryOptions.inJustDecodeBounds = true;
            returnBmp = BitmapFactory.decodeStream(getContentResolver()
                    .openInputStream(imageFileUri), null, bmpFactoryOptions);

            int heightRatio = (int) Math.ceil(bmpFactoryOptions.outHeight / dh);
            int widthRatio = (int) Math.ceil(bmpFactoryOptions.outWidth / dw);

            Log.v("HEIGHTRATIO", "" + heightRatio);
            Log.v("WIDTHRATIO", "" + widthRatio);

            // If both of the ratios are greater than 1, one of the sides of the
            // image is greater than the screen
            if (heightRatio > 1 && widthRatio > 1) {
                if (heightRatio > widthRatio) {
                    // Height ratio is larger, scale according to it
                    bmpFactoryOptions.inSampleSize = heightRatio;
                } else {
                    // Width ratio is larger, scale according to it
                    bmpFactoryOptions.inSampleSize = widthRatio;
                }
            }

            // Decode it for real
            bmpFactoryOptions.inJustDecodeBounds = false;
            returnBmp = BitmapFactory.decodeStream(getContentResolver()
                    .openInputStream(imageFileUri), null, bmpFactoryOptions);
        } catch (FileNotFoundException e) {
            Log.v("ERROR", e.toString());
        }

        return returnBmp;
    }
}

2 个答案:

答案 0 :(得分:3)

试试这个:

public class Aura extends Activity {
  protected static final String TAG = Aura.class.getName();
  private static String mTempDir;
  Bitmap mBackImage, mTopImage, mBackground, mInnerImage, mNewSaving;
  Canvas mComboImage;
  FileOutputStream mFileOutputStream;
  BitmapDrawable mBitmapDrawable;
  private String mCurrent = null;

  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.aura);

    mTempDir = Environment.getExternalStorageDirectory() + "/" + "Aura" + "/";
    mCurrent = "Aura.png";
    prepareDirectory();

    mBackground = Bitmap.createBitmap(604, 1024, Bitmap.Config.ARGB_8888);
    mBackImage = BitmapFactory.decodeResource(getResources(), R.drawable.aura);
    mTopImage = BitmapFactory.decodeResource(getResources(), R.drawable.test);
    mInnerImage = BitmapFactory.decodeResource(getResources(), R.drawable.anothertest);

    mComboImage = new Canvas(mBackground);
    mComboImage.drawBitmap(mBackImage, 0f, 0f, null);
    mComboImage.drawBitmap(mTopImage, 0f, 0f, null);
    mComboImage.drawBitmap(mInnerImage, 0f, 0f, null);
    mFileOutputStream = null;

    mSave.setOnClickListener(new View.OnClickListener() {
      public void onClick(View v) {
        Log.v(TAG, "Save Tab Clicked");
        try {
          mBitmapDrawable = new BitmapDrawable(mBackground);
          mNewSaving = ((BitmapDrawable) mBitmapDrawable).getBitmap();
          String FtoSave = mTempDir + mCurrent;
          File mFile = new File(FtoSave);
          mFileOutputStream = new FileOutputStream(mFile);
          mNewSaving.compress(CompressFormat.PNG, 95, mFileOutputStream);
          mFileOutputStream.flush();
          mFileOutputStream.close();
        } catch (FileNotFoundException e) {
          Log.v(TAG, "FileNotFoundExceptionError " + e.toString());
        } catch (IOException e) {
          Log.v(TAG, "IOExceptionError " + e.toString());
        }
      }
    });
  }//onCreate

  private boolean prepareDirectory() {
    try {
      if (makeDirectory()) {
        return true;
      } else {
        return false;
      }
    } catch (Exception e) {
      e.printStackTrace();
      Toast.makeText(this, getString(R.string.sdcard_error), 1000).show();
      return false;
    }
  }

  private boolean makeDirectory() {
    File mTempFile = new File(mTempDir);
    if (!mTempFile.exists()) {
      mTempFile.mkdirs();
    }

    if (mTempFile.isDirectory()) {
      File[] mFiles = mTempFile.listFiles();
      for (File mEveryFile : mFiles) {
        if (!mEveryFile.delete()) {
          System.out.println(getString(R.string.failed_to_delete) + mEveryFile);
        }
      }
    }
    return (mTempFile.isDirectory());
  }

  @Override
  public boolean onKeyDown(int keyCode, KeyEvent event) {
    if ((!(android.os.Build.VERSION.SDK_INT > android.os.Build.VERSION_CODES.DONUT)
        && keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0)) {
      onBackPressed();
    }
    return super.onKeyDown(keyCode, event);
  }

  public void onBackPressed() {
    finish();
  }
}

答案 1 :(得分:0)

创建一个新的Bitmap,其中包含图像各个高度的高度和。

        Bitmap newBitmap = Bitmap.createBitmap(widht 
                , totalHeight, Config.ARGB_8888);
Canvas canvas = new Canvas(newBitmap);
canvas.drawBitmap(image11, 0, 0, null);
canvas.drawBitmap(image2, 0, image1Height, null);

这应该将2个图像绘制到newBitmap,一个在另一个之下。如果您想要并排高度参数,请将其更改为

这是你在找什么?