android - 合并两个图像并保存到 sd 卡

标签 android

我有组合两个 image 并在 canvas 中一起显示它们的代码,如下所示。你能说说如何将其存储单个图像吗。

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;
    }
}

最佳答案

试试这个:

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();
  }
}

关于android - 合并两个图像并保存到 sd 卡,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8611625/

相关文章:

android - Android 位图中 getPixel 和 getPixel 的更快替代方案?

javascript - Android App软键盘覆盖嵌入webview的网页textarea

android - 检查注册的内容观察者

android - 对特定语言的 strings.xml 文件启用 Android Studio 拼写检查

android - 如何在 android 中关闭搜索 View 后重置 ListView ?

java - Android VpnService 如何在打开 Socket 之前处理传入的数据包?

java - 如何使应用程序与 Asterisk 服务器进行交互以进行调用?

java - Android 使用套接字时崩溃

javascript - Webview 不显示 JavaScript 警报

Android Studio 2.2.3 在我的笔记本电脑上经常挂起