有关位图的几点总结

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

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

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

Resources res=getResources();
 


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


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

包括文件,流,字节数组

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

 



  
  1. public class MainActivity extends Activity {
  2.     /** Called when the activity is first created. */
  3.     @Override
  4.     public void onCreate(Bundle savedInstanceState) {
  5.         super.onCreate(savedInstanceState);
  6.         setContentView(new BmpPanel(this));
  7.     }
  8.    
  9.     class BmpPanel extends View{             
  10.         public BmpPanel(Context context)
  11.             super(context);
  12.         }     
  13.         public void onDraw(Canvas canvas)
  14.             Bitmap bmp = BitmapFactory.decodeResource(getResources(), R.drawable.pic); 
  15.             //canvas.drawColor(Color.BLACK); 
  16.             canvas.drawBitmap(bmp, 10, 10, null); 
  17.         } 
  18.     }
  19. }


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







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





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




  
  1.     * /**
  2.     *    * create the bitmap from a byte array
  3.     *    *
  4.     *    * @param src the bitmap object you want proecss
  5.     *    * @param watermark the water mark above the src
  6.     *    * @return return a bitmap object ,if paramter's length is 0,return null
  7.     *    */
  8.     *    private Bitmap createBitmap( Bitmap src, Bitmap watermark ) 
  9.     *    { 
  10.     *        String tag = "createBitmap"
  11.     *        Log.d( tag, "create a new bitmap" ); 
  12.     *        if( src == null
  13.     *        { 
  14.     *            return null
  15.     *        } 
  16.     * 
  17.     *        int w = src.getWidth(); 
  18.     *        int h = src.getHeight(); 
  19.     *        int ww = watermark.getWidth(); 
  20.     *        int wh = watermark.getHeight(); 
  21.     *        //create the new blank bitmap 
  22.     *        Bitmap newb = Bitmap.createBitmap( w, h, Config.ARGB_8888 );//创建一个和src大小一样的空位图 
  23.     *        Canvas cv = new Canvas( newb ); 
  24.     *        //draw src into 
  25.     *        cv.drawBitmap( src, 0, 0, null );//在 0,0坐标开始画入src 
  26.     *        //draw watermark into 
  27.     *        cv.drawBitmap( watermark, w - ww + 5, h - wh + 5, null );//在src的右下角画入水印 
  28.     *        //save all clip 
  29.     *        cv.save( Canvas.ALL_SAVE_FLAG );//保存 
  30.     *        //store 
  31.     *        cv.restore();//存储 
  32.     *        return newb; 
  33.     *    }








  
  1. int px = getMeasuredWidth();
  2. int py = getMeasuredWidth();
  3. // Draw background
  4. canvas.drawRect(0, 0, px, py, backgroundPaint);
  5. canvas.save();
  6. canvas.rotate(90, px/2, py/2);               
  7. // Draw up arrow
  8. canvas.drawLine(px / 2, 0, 0, py / 2, linePaint);               
  9. canvas.drawLine(px / 2, 0, px, py / 2, linePaint);
  10. canvas.drawLine(px / 2, 0, px / 2, py, linePaint);
  11. canvas.restore();
  12. // Draw circle
  13. 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

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

全部回复

上滑加载中

设置昵称

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

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

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