【问题标题】:How to change programmatically the bitmap?如何以编程方式更改位图?
【发布时间】:2014-12-18 06:10:36
【问题描述】:

我有这种情况,一切正常,但我认为这是一个混乱的代码。你能帮我一个更好的代码,我想更新背景位图我只改变mBg。

我有这种情况,一切正常,但我认为这是一个混乱的代码。你能帮我一个更好的代码,我想更新背景位图我只改变mBg。

Bitmap mBg;

  mBackground = Bitmap.createBitmap(1800, 1200, Bitmap.Config.RGB_565);
    // Put back and top images in your res folder
    BitmapFactory.Options options = new BitmapFactory.Options();
    options.inPreferredConfig = Bitmap.Config.ARGB_8888;

    File f = new File(AppConstant.filepathone);
    Bitmap mImageone = decodeFile(f);
    File g = new File(AppConstant.filepathtwo);
    Bitmap mImagetwo = decodeFile(g);
    File h = new File(AppConstant.filepaththree);
    Bitmap mImagethree = decodeFile(h);
    File i = new File(AppConstant.filepathfour);
    Bitmap mImagefour = decodeFile(i);

    if (sharedpreferences.getString("getFrame", "getFrame") == "Frame1") {
        mBg = BitmapFactory.decodeResource(getResources(),
                R.drawable.frameone);
        Bitmap mBack = Bitmap.createScaledBitmap(mBg, 1800, 1200, true);
        Bitmap mImaget = Bitmap.createScaledBitmap(mImagetwo, 515, 360,
                true);
        Bitmap mImageth = Bitmap.createScaledBitmap(mImagethree, 515, 360,
                true);
        Bitmap mImagef = Bitmap.createScaledBitmap(mImagefour, 515, 360,
                true);
        Bitmap mImageo = Bitmap.createScaledBitmap(mImageone, 1080, 635,
                true);

        mCanvas = new Canvas(mBackground);
        mCanvas.drawARGB(255, 150, 150, 10);
        mCanvas.drawBitmap(mBack, 0, 0, null);
        mCanvas.drawBitmap(mImaget, 75, 75, null);
        mCanvas.drawBitmap(mImageo, 75, 490, null);
        mCanvas.drawBitmap(mImageth, 645, 75, null);
        mCanvas.drawBitmap(mImagef, 1215, 75, null);

    } else if (sharedpreferences.getString("getFrame", "getFrame") == "Frame2") {
        mBg = BitmapFactory.decodeResource(getResources(),
                R.drawable.frametwo);
        Bitmap mBack = Bitmap.createScaledBitmap(mBg, 1800, 1200, true);
        Bitmap mImaget = Bitmap.createScaledBitmap(mImagetwo, 515, 360,
                true);
        Bitmap mImageth = Bitmap.createScaledBitmap(mImagethree, 515, 360,
                true);
        Bitmap mImagef = Bitmap.createScaledBitmap(mImagefour, 515, 360,
                true);
        Bitmap mImageo = Bitmap.createScaledBitmap(mImageone, 1080, 635,
                true);

        mCanvas = new Canvas(mBackground);
        mCanvas.drawARGB(255, 150, 150, 10);
        mCanvas.drawBitmap(mBack, 0, 0, null);
        mCanvas.drawBitmap(mImaget, 75, 75, null);
        mCanvas.drawBitmap(mImageo, 75, 490, null);
        mCanvas.drawBitmap(mImageth, 645, 75, null);
        mCanvas.drawBitmap(mImagef, 1215, 75, null);

    } else if (sharedpreferences.getString("getFrame", "getFrame") == "Frame3") {
        mBg = BitmapFactory.decodeResource(getResources(),
                R.drawable.framethree);
        Bitmap mBack = Bitmap.createScaledBitmap(mBg, 1800, 1200, true);
        Bitmap mImaget = Bitmap.createScaledBitmap(mImagetwo, 515, 360,
                true);
        Bitmap mImageth = Bitmap.createScaledBitmap(mImagethree, 515, 360,
                true);
        Bitmap mImagef = Bitmap.createScaledBitmap(mImagefour, 515, 360,
                true);
        Bitmap mImageo = Bitmap.createScaledBitmap(mImageone, 1080, 635,
                true);

        mCanvas = new Canvas(mBackground);
        mCanvas.drawARGB(255, 150, 150, 10);
        mCanvas.drawBitmap(mBack, 0, 0, null);
        mCanvas.drawBitmap(mImaget, 75, 75, null);
        mCanvas.drawBitmap(mImageo, 75, 490, null);
        mCanvas.drawBitmap(mImageth, 645, 75, null);
        mCanvas.drawBitmap(mImagef, 1215, 75, null);
    }

    try {
        String friendlydate = DateFormat.getTimeInstance(DateFormat.MEDIUM)
                .format(new Date());
        friendlydate = friendlydate.replace(':', '_');
        String filename = friendlydate + ".jpg";
        mBitmapDrawable = new BitmapDrawable(mBackground);
        Bitmap mNewSaving = mBitmapDrawable.getBitmap();
        String FtoSave = mTempDir + filename;
        File mFile = new File(FtoSave);
        mFileOutputStream = new FileOutputStream(mFile);

        // mNewSaving.recycle();
        mNewSaving.compress(Bitmap.CompressFormat.PNG, 100,
                mFileOutputStream);
        mFileOutputStream.flush();
        mFileOutputStream.close();
        mFileOutputStream = null;

【问题讨论】:

    标签: java android bitmap camera


    【解决方案1】:

    这里有一些提示给你

    1. 在 java 中,您永远不应该使用“==”运算符来比较字符串。使用String.equals() 中的if (sharedpreferences.getString("getFrame", "getFrame").equals("Frame1") 方法,否则您将比较它们的指针而不是它们的实际内容。
    2. 唯一会根据共享首选项“getFrame”的值而改变的是变量 mbg,因此实际上您需要将它放在这些 if 块中。您的整个 if 块将缩减为:

      if (sharedpreferences.getString("getFrame", "getFrame").equals("Frame1")) {
          mBg = BitmapFactory.decodeResource(getResources(),
                  R.drawable.frameone);
      } else if (sharedpreferences.getString("getFrame", "getFrame").equals("Frame2")) {
          mBg = BitmapFactory.decodeResource(getResources(),
                  R.drawable.frametwo);
      } else if (sharedpreferences.getString("getFrame", "getFrame").equals("Frame3")) {
          mBg = BitmapFactory.decodeResource(getResources(),
                  R.drawable.framethree);
      }
      
      Bitmap mBack = Bitmap.createScaledBitmap(mBg, 1800, 1200, true);
      Bitmap mImaget = Bitmap.createScaledBitmap(mImagetwo, 515, 360,
              true);
      Bitmap mImageth = Bitmap.createScaledBitmap(mImagethree, 515, 360,
              true);
      Bitmap mImagef = Bitmap.createScaledBitmap(mImagefour, 515, 360,
              true);
      Bitmap mImageo = Bitmap.createScaledBitmap(mImageone, 1080, 635,
              true);
      
      mCanvas = new Canvas(mBackground);
      mCanvas.drawARGB(255, 150, 150, 10);
      mCanvas.drawBitmap(mBack, 0, 0, null);
      mCanvas.drawBitmap(mImaget, 75, 75, null);
      mCanvas.drawBitmap(mImageo, 75, 490, null);
      mCanvas.drawBitmap(mImageth, 645, 75, null);
      mCanvas.drawBitmap(mImagef, 1215, 75, null);
      
    3. 如果您通过创建将帧名称映射到已解码资源的映射多次调用此方法,则可以更有效地选择mBg 变量。为此,您最好在 Activity 的 onCreate() 方法中声明并填充如下地图:

      Map<String, Bitmap> mBgMap = new HashMap<>();
      mBgMap.put("Frame1", BitmapFactory.decodeResource(getResources(),
          R.drawable.frameone));
      mBgMap.put("Frame2", BitmapFactory.decodeResource(getResources(),
          R.drawable.frametwo));
      mBgMap.put("Frame3", BitmapFactory.decodeResource(getResources(),
          R.drawable.framethree));
      

    然后只需将那个笨拙的if 块替换为:

        mBg = mBgMap.get(sharedpreferences.getString("getFrame", "getFrame"));
    

    【讨论】:

      【解决方案2】:

      试试这个

      String uri = "@drawable/myresource.png";
      int imageResource = getResources().getIdentifier(uri, null, getPackageName());
      imageview= (ImageView)findViewById(R.id.imageView);
      Drawable res = getResources().getDrawable(imageResource);
      imageView.setImageDrawable(res);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-12-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-07-16
        • 1970-01-01
        • 2012-10-05
        相关资源
        最近更新 更多