有关位图的几点总结

举报
ShaderJoy 发表于 2021/12/29 23:39:23 2021/12/29
4.1k+ 0 0
【摘要】 位图是我们开发中最常用的资源 1. 从资源中获取位图 可以使用BitmapDrawable或者BitmapFactory来获取资源中的位图。 首先,需要获取资源: Resources res=getResources();(1)使用BitmapDrawable获取位图 // 读取InputStream并得到位图InputSt...

位图是我们开发中最常用的资源

1. 从资源中获取位图
可以使用BitmapDrawable或者BitmapFactory来获取资源中的位图。
首先,需要获取资源:

Resources res=getResources();
 


      // 读取InputStream并得到位图
      InputStream is=res.openRawResource(R.drawable.pic);
      BitmapDrawable bmpDraw=new BitmapDrawable(is);
      Bitmap bmp=bmpDraw.getBitmap();
  
 


      BitmapDrawable bmpDraw=(BitmapDrawable)res.getDrawable(R.drawable.pic);
      Bitmap bmp=bmpDraw.getBitmap();
  
 

包括文件,流,字节数组

Bitmap bmp=BitmapFactory.decodeResource(res, R.drawable.pic);

 



      public class MainActivity extends Activity {
          /** Called when the activity is first created. */
          @Override
          public void onCreate(Bundle savedInstanceState) {
              super.onCreate(savedInstanceState);
              setContentView(new BmpPanel(this));
          }
          class BmpPanel extends View{
              public BmpPanel(Context context) {
                  super(context);
              }
              public void onDraw(Canvas canvas){
                  Bitmap bmp = BitmapFactory.decodeResource(getResources(), R.drawable.pic);
                  //canvas.drawColor(Color.BLACK);  
                  canvas.drawBitmap(bmp, 10, 10, null);
              }
          }
      }
  
 


              // 获取位图
              Bitmap bmp=BitmapFactory.decodeResource(res, R.drawable.pic);
              // 转换为BitmapDrawable对象
              BitmapDrawable bmpDraw=new BitmapDrawable(bmp);
              // 显示位图
              ImageView iv = (ImageView)findViewById(R.id.ImageView);
             iv.setImageDrawable(bmpDraw);
  
 







                  Bitmap bmp = BitmapFactory.decodeResource(getResources(), R.drawable.pic);
                  Matrix matrix=new Matrix();
                  matrix.postScale(0.5f, 0.5f);
                  Bitmap dstbmp=Bitmap.createBitmap(bmp,0,0,bmp.getWidth(),bmp.getHeight(),matrix,true);
                  //canvas.drawColor(Color.BLACK);  
                  canvas.drawBitmap(dstbmp, 10, 10, null);
  
 





                  Bitmap bmp = BitmapFactory.decodeResource(getResources(), R.drawable.pic);
                  Matrix matrix=new Matrix();
                  matrix.postScale(0.8f, 0.8f);
                  matrix.postRotate(45);
                  Bitmap dstbmp=Bitmap.createBitmap(bmp,0,0,bmp.getWidth(),
                  bmp.getHeight(),matrix,true);
                  canvas.drawColor(Color.BLACK);
                  canvas.drawBitmap(dstbmp, 10, 10, null);
  
 




          * /**
          *    * create the bitmap from a byte array
          *    *
          *    * @param src the bitmap object you want proecss
          *    * @param watermark the water mark above the src
          *    * @return return a bitmap object ,if paramter's length is 0,return null
          *    */
          *    private Bitmap createBitmap( Bitmap src, Bitmap watermark )
          *    {
          *        String tag = "createBitmap";
          *        Log.d( tag, "create a new bitmap" );
          *        if( src == null )
          *        {
          *            return null;
          *        }
          *
          *        int w = src.getWidth();
          *        int h = src.getHeight();
          *        int ww = watermark.getWidth();
          *        int wh = watermark.getHeight();
          *        //create the new blank bitmap  
          *        Bitmap newb = Bitmap.createBitmap( w, h, Config.ARGB_8888 );//创建一个和src大小一样的空位图  
          *        Canvas cv = new Canvas( newb );
          *        //draw src into  
          *        cv.drawBitmap( src, 0, 0, null );//在 0,0坐标开始画入src  
          *        //draw watermark into  
          *        cv.drawBitmap( watermark, w - ww + 5, h - wh + 5, null );//在src的右下角画入水印  
          *        //save all clip  
          *        cv.save( Canvas.ALL_SAVE_FLAG );//保存  
          *        //store  
          *        cv.restore();//存储  
          *        return newb;
          *    }
  
 








      int px = getMeasuredWidth();
      int py = getMeasuredWidth();
      // Draw background
      canvas.drawRect(0, 0, px, py, backgroundPaint);
      canvas.save();
      canvas.rotate(90, px/2, py/2);
      // Draw up arrow
      canvas.drawLine(px / 2, 0, 0, py / 2, linePaint);
      canvas.drawLine(px / 2, 0, px, py / 2, linePaint);
      canvas.drawLine(px / 2, 0, px / 2, py, linePaint);
      canvas.restore();
      // Draw circle
      canvas.drawCircle(px - 10, py - 10, 10, linePaint);
  
 
效果如图1所示:

_23346

如果我们不调用save和restore会是什么样子呢?如图2所示:

_23347

从这两个图中,我们就能看到圆圈位置的明显差异。不进行Canvas的save和restore操作的话,所有的图像都是在画布旋转90°后的画布上绘制的。当执行完onDraw方法,系统自动将画布恢复回来。save和restore操作执行的时机不同,就能造成绘制的图形不同。


文章来源: panda1234lee.blog.csdn.net,作者:panda1234lee,版权归原作者所有,如需转载,请联系作者。

原文链接:panda1234lee.blog.csdn.net/article/details/8557393

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

作者其他文章

评论(0

抱歉,系统识别当前为高风险访问,暂不支持该操作

    全部回复

    上滑加载中

    设置昵称

    在此一键设置昵称,即可参与社区互动!

    *长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

    *长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。