




已阅读5页,还剩37页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
2020/6/5,第六章Android图像与图像变换,教学内容,图像资源图像文件类型图像存取Bitmap与BitmapFactory图形绘制图像变换XML处理艺术代码处理艺术矩阵处理艺术,图像资源,图像文件类型图像存取Bitmap与BitmapFactory,图形文件类型,图片格式类型:png(preferred),jpg(acceptable),gif(discouraged)一般使用png格式比较好!图片文件命名:以小写字母或下划线做首字母,随后的名字中只能出现“az”、“09”、“_”、“.”这些字符。图片分辨率:若图片置于res/drawable目录下,为了兼容不同平台不同屏幕,建议根据图片的分辨率,将图片放在相应的文件夹下。,图形存取,Drawable:抽象类,表示可画的对象类,一般存于/res/drawable-*/目录下assets目录InputStreamis=getResources().getAssets().open(name);sdcard中BitmapimageBitmap=BitmapFactory.decodeFile(path)其他目录Stringpath=com/xiangmu/test.png;InputStreamis=getClassLoader().getResourceAsStream(path);,使用Drawable,assets目录下的文件都是保持原始的文件格式,需要用AssetManager以字节流的形式读取文件。1.先在Activity里面调用getAssets()来获取AssetManager的引用。2.再用AssetManager的open(StringfileName,intaccessMode)方法指定读取的文件以及访问模式,就能得到输入流InputStream。3.用已经openfile的InputStream读取文件,读取完成后关闭,inputStream.close()。4.调用AssetManager.close()关闭AssetManager。,Assets,Bitmap和BitmapFactory,BitmapBitmap代表一张位图,BitmapDrawable里封装的图片就是一个Bitmap对象,开发者为了把一个Bitmap对象包装成BitmapDrawable对象,可以调用BitmapDrawable的构造器:BitmapDrawabledrawable=NewBitmapDrawable(bitmap);如果需要获取BitmapDrawable所包装的Bitmap对象,则可调用BitmapDrawable的getBitmap()方法,如下面的代码所示:Bitmapbitmap=drawable.getBitmap();,createBitmap(Bitmapsource,intx,inty,intwidth,intheight):从源位图sourse的指定坐标点(给定x、y)开始,从中“挖取”宽width、高height的一块出来,创建新的Bitmap对象。createScaledBitmap(Bitmapsrc,intdstWidth,intdstHeight,booleanfilter):对原位图src进行缩放,缩放成宽dstWidth、高dstHeight的新位图。createBitmap(intwidth,intheight,Bitmap.Configconfig):创建一个宽width、高height的新位图。createBitmap(Bitmapsource,intx,inty,intwidth,intheight,Matrixm,booleanfilter):从源位图source的指定坐标点(给定x、y)开始,从中“挖取”宽width、高height的一块出来,创建新的Bitmap对象。并按Matrix指定的规则进行变换。,静态方法创建新的Bitmap对象,BitmapFactory是一个工具类,它用于提供大量的方法,这些方法可用于从不同的数据源来解析、创建Bitmap对象,BitmapFactory包含了如下方法:decodeByteArray(bytedate,intoffset,intlength):从指定字节数组的offset位置开始,将长度为length的字节数据解析成Bitmap对象。decodeFile(StringpathName):从pathName指定的文件中解析、创建Bitmap对象。decodeFileDescriptor(FileDescriptorfd):用于从FileDescriptor对应的文件中解析、创建Bitmap对象。decodeResource(Resourceres,intid):用于根据给定的资源ID从指定资源中解析、创建Bitmap对象。decodeStream(InputStreamis):用于从指定输入流中解析、创建Bitmap对象。,BitmapFactory,大部分时候,我们只要把图片放在/res/drawable目录下,就可以在程序中通过该图片对应的资源ID来获取封装该图片的Drawable对象。但由于手机系统的内存比较小,如果系统不停地去解析,创建Bitmap对象,可能由于前面创建Bitmap所占用的内存还没有回收,而导致程序运行时引发OutOfMemory错误。Android为Bitmap提供了两个方法来判断它是否已回收,以及强制Bitmap回收自己:booleanisRecycled():返回该Bitmap对象是否已被回收。voidrecycle():强制一个Bitmap对象立即回收自己。除此之外,如果Android应用需要访问其他存储路径(比如SD卡中)里的图片,都需要借助BitmapFactory来解析、创建Bitmap对象。,Bitmap回收,例1:开发一个查看/assets/目录下图片查看器,用户单击按钮时程序会自动去搜索/assets/目录下的下一张图片。,参考代码1:获取资源,image=(ImageView)findViewById(R.id.image);tryassets=getAssets();/获取/assets/目录下所有文件images=assets.list();catch(IOExceptione)e.printStackTrace();,参考代码2:点击事件,if(currentImg=images.length-4)currentImg=0;elsecurrentImg+;try/打开指定资源对应的输入流assetFile=assets.open(imagescurrentImg);catch(IOExceptione)e.printStackTrace();BitmapDrawablebitmapDrawable=(BitmapDrawable)image.getDrawable();/如果图片还未回收,先强制回收该图片if(bitmapDrawable!=null/调用BitmapFactory从指定输入流解析、并创建Bitmap对象,图像绘制,图像基础图形绘制,View类开发框架在View类框架中,任何自定义的View类都只需要重写onDraw()方法来进行界面的显示onDraw()方法不能被直接调用,想要重新加载界面通常有两种方法,一种是在Handler中调用invalidate,另一种是直接在线程中调用postInvalidate()invalidate()不能直接在工作者线程中进行调用,因为它违背了单线程模型,而android的UI操作并不是线程安全的。而postInvalidate()可以在工作者线程中直接进行调用,图像基础,图像基础,Paint类画笔Paint类包含如何绘制几何形状、文本和位图的样式及颜色信息Paint文本绘制主要包括这些方面,如setColor()、setTypeface()、setTextSize()等Paint图形图像绘制主要通过setColor()、setStyle()等方法来设置setARGB:设置画笔的a,r,g,b颜色值。setAlpha:设置Alpha值。setAntiAlias:设置画笔的锯齿效果,图像基础,Color类颜色被表示为封装的数值,这个数值由四个字节组成,分别为alpha、red、green、blue,任何透明性只存储在alpha部分。Color类定义了一些方法来创建和转换颜色值。如red(intcolor)、green(intcolor)、blue(intcolor)等方法可以获取一个颜色常量值的红绿蓝分色,而HSVToColor()、RGBToHSV()等方法可以在不同颜色空间进行颜色的转换。,图形绘制,Android的绘图思路是继承View组件,并重写它的onDraw(Canvascanvas)方法。重写onDraw(Canvascanvas)方法时涉及一个绘图API:Canvas,Canvas代表了“依附”于指定View的画布,它提供了如表1所示的方法绘制各种图形。除了表1所定义的各种方法之外,Canvas还提供了如下方法进行变换:rotate(floatdegrees,floatpx,floatpy):对Canvas执行旋转。scale(floatsx,floatsy,floatpx,floatpy):对Canvas执行缩放。translate(floatdx,floatdy):移动Canvas,向右移动dx距离(dx为负数即向左移动);向下移动dy距离(dy为负数即向上移动)。,例2:在Android应用中绘制基本的集合图形,参考代码,/把整张画布绘制成白色canvas.drawColor(Color.WHITE);Paintpaint=newPaint();/去锯齿paint.setAntiAlias(true);/设置paint的颜色paint.setColor(Color.BLUE);/设置paint的style为STROKE:空心paint.setStyle(Paint.Style.STROKE);/设置paint的外框宽度paint.setStrokeWidth(3);,/绘制一条线canvas.drawLine(0,0,320,430,paint);/绘制空心圆形canvas.drawCircle(40,40,30,paint);/绘制空心正方形canvas.drawRect(10,80,70,140,paint);/绘制空心矩形canvas.drawRect(10,150,70,190,paint);RectFre1=newRectF(10,200,70,230);/绘制空心圆角矩形canvas.drawRoundRect(re1,15,15,paint);RectFre11=newRectF(10,240,70,270);/绘制空心椭圆canvas.drawOval(re11,paint);,/定义一个Path对象,封闭成一个三角形。Pathpath1=newPath();path1.moveTo(10,340);path1.lineTo(70,340);path1.lineTo(40,290);path1.close();/根据Path进行绘制,绘制空心三角形canvas.drawPath(path1,paint);/定义一个Path对象,封闭成一个五角形。Pathpath2=newPath();path2.moveTo(26,360);path2.lineTo(54,360);path2.lineTo(70,392);path2.lineTo(40,420);path2.lineTo(10,392);path2.close();/根据Path进行绘制,绘制空心五角形canvas.drawPath(path2,paint);,/-设置填充风格后绘制-paint.setStyle(Paint.Style.FILL);paint.setColor(Color.RED);canvas.drawCircle(120,40,30,paint);/绘制正方形canvas.drawRect(90,80,150,140,paint);/绘制矩形canvas.drawRect(90,150,150,190,paint);/绘制圆角矩形RectFre2=newRectF(90,200,150,230);canvas.drawRoundRect(re2,15,15,paint);/绘制椭圆RectFre21=newRectF(90,240,150,270);canvas.drawOval(re21,paint);,/绘制三角形Pathpath3=newPath();path3.moveTo(90,340);path3.lineTo(150,340);path3.lineTo(120,290);path3.close();canvas.drawPath(path3,paint);/绘制五角形Pathpath4=newPath();path4.moveTo(106,360);path4.lineTo(134,360);path4.lineTo(150,392);path4.lineTo(120,420);path4.lineTo(90,392);path4.close();canvas.drawPath(path4,paint);,/*为Paint设置渐变器,新建1个线性渐变,前2个参数是渐变开始的点坐标,第3,4个参数是渐变结束的点的坐标。连接这2个点就拉出一条渐变线。数组为渐变的颜色。下1个参数是渐变颜色的分布,如果为空,每个颜色就是均匀分布的。最后是模式,这里设置的是循环渐变*/ShadermShader=newLinearGradient(0,0,40,60,newintColor.RED,Color.GREEN,Color.BLUE,Color.YELLOW,null,Shader.TileMode.REPEAT);paint.setShader(mShader);/设置阴影,第1个参数是阴影扩散半径,第2个参数是阴影在X和Y方向的偏移量,最后1个参数是颜色paint.setShadowLayer(45,10,10,Color.GRAY);/绘制圆形canvas.drawCircle(200,40,30,paint);/绘制正方形canvas.drawRect(170,80,230,140,paint);/绘制矩形canvas.drawRect(170,150,230,190,paint);/绘制圆角矩形RectFre3=newRectF(170,200,230,230);canvas.drawRoundRect(re3,15,15,paint);,/绘制椭圆RectFre31=newRectF(170,240,230,270);canvas.drawOval(re31,paint);/根据Path进行绘制,绘制三角形Pathpath5=newPath();path5.moveTo(170,340);path5.lineTo(230,340);path5.lineTo(200,290);path5.close();canvas.drawPath(path5,paint);/根据Path进行绘制,绘制五角形Pathpath6=newPath();path6.moveTo(186,360);path6.lineTo(214,360);path6.lineTo(230,392);path6.lineTo(200,420);path6.lineTo(170,392);path6.close();canvas.drawPath(path6,paint);,/-设置字符大小后绘制-paint.setTextSize(24);paint.setShader(null);/绘制7个字符串canvas.drawText(getResources().getString(R.string.circle),240,50,paint);canvas.drawText(getResources().getString(R.string.square),240,120,paint);canvas.drawText(getResources().getString(R.string.rect),240,175,paint);canvas.drawText(getResources().getString(R.string.round_rect),230,220,paint);canvas.drawText(getResources().getString(R.string.oval),240,260,paint);canvas.drawText(getResources().getString(R.string.triangle),240,325,paint);canvas.drawText(getResources().getString(R.string.pentagon),240,390,paint);,图形艺术,图像变换,动画模式Tweenedanimation(渐变动画)Framebyframe(帧动画)渐变动画类型Alpha(透明度)Scale(伸缩)Translate(位置变换)Rotate(图形旋转),图像变换方法,XML变换代码变换矩阵变换,XML变换_建立anim目录和myanim.xml,myAnimation=AnimationUtils.loadAnimation(this,R.anim.myanim);/加载动画myImageView=(ImageView)this.findViewById(R.id.myImageView);/得到ImageView的引用myImageView.startAnimation(myAnimation);/启动动画,代码变换,myImageView=(ImageView)this.findViewById(R.id.myImageView);/得到ImageView的引用/myImageView.startAnimation(myAnimation);/启动动画myAnimation=newAlphaAnimation(0.1f,1.0f);myAnimation.setDuration(8000);myAnimation=newRotateAnimation(0,360,Animation.RELATIVE_TO_SELF,0.5f,Animation.RELATIVE_TO_SELF,0.5f);myAnimation.setInterpolator(this,android.R.anim.accelerate_decelerate_interpolator);myAnimation.setDuration(10000);myImageView.startAnimation(myAnimation);/启动动画,矩阵变换,在编程中有时候需要对图片做特殊的处理,比如将图片做出黑白的,或者老照片的效果,有时候还需要对图片进行变换、拉伸、扭曲等等。这些效果在Android中有很好的支持,通过颜色矩阵(ColorMatrix)和坐标变换矩阵(Matrix)可以完美的做出上面的所说的效果。下面将分别介绍这两个矩阵的用法和相关的函数。,使用ColorMatrix处理图片颜色,Android中可以通过颜色矩阵(ColorMatrix类)来操作颜色,颜色矩阵是一个5x4的矩阵(如图1)可以用来全面的修改图2中RGBA各分量的值,颜色矩阵以一维数组的方式存储如下:a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t它通过RGBA四个通道来直接操作对应颜色,这个矩阵对颜色的作用计算方式如图3所示:,C矩阵是图片中包含的RGBA信息,R矩阵是用颜色矩阵应用于C之后的新的颜色分量,运算结果如下:R=a*R+b*G+c*B+d*A+e;G=f*R+g*G+h*B+i*A+j;B=k*R+l*G+m*B+n*A+o;A=p*R+q*G+r*B+s*A+t;,红色分量增加100,绿色分量增加100,因为红色和绿色混合后得到黄色,黄色分量增加100,图片最终效果变黄,改变各分量,可以通过修改各列的值例如:,将绿色分量乘以2变为原来的2倍,使用Matrix控制变换图片,坐标变换矩阵是一个3*3的矩阵(如图5),用来对图形进行坐标变化,将原来的坐标点转移到新的坐标点,因为一个图片是有点阵和每一点上的颜色信息组成的,所以对坐标的变换,就是对每一点进行搬移形成新的图片。即图形的放大缩小,移动,旋转,透视,扭曲这些效果都可以用此矩阵来完成。这个矩阵的作用是对坐标x,y进行变换计算结果如下:x=a*x+b*y+cy=d*x+e*y+f通常情况下g=h=0,这样使1=0*x+0*y+1恒成立。,几种常用的变换矩阵:旋转:绕原点逆时针旋转度角的变换公式是x=xcosysin与y=xsin+ycos缩放:变换后长宽分别放大x=scale*x,y=scale*y切变反射:单位向量正投影:单位向量,上面的各种效果也可以叠加在一起,既矩阵的组合变换,可以用矩阵乘法实现之,如:R=B(A*C)=(B*A)C。注意:B*A和A*B一般是不等的。Matrix是Android提供的一个矩阵工具类,它本身不能对图像或组件进行变换,但它可与其他API结合来控制图形、组件的变换。使用Matrix控制图像或组件变换的步骤如下:获取Matrix对象,该Matrix对象既可新创建,也可以直接获取其他对象内封装的Matrix(例如Transformation对象内部就封装了Matrix)。调用Matrix的方法进行平移、缩放、旋转、倾斜等。将程序对Matrix所做的变换应用到指定的图像或组件。,Matrix提供了如下方法来控制平移、旋转和缩放:setTranslate(floatdx,floatdy):控制M
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 煤矿安全培训考评表课件
- 2025年GSP培训试题及答案
- 商铺基础知识培训课件
- 手术部位感染防控措施试题及答案
- CCU2025年中理论知识考试题及答案
- 计算机及外部设备装配调试员质量管控考核试卷及答案
- 钒铁浸滤工综合考核试卷及答案
- 2025血液净化sop第三期考试题及答案
- 煤矿安全培训管理制度课件
- 纯三氧化钨、仲钨酸铵、兰钨制取工岗位操作技能考核试卷及答案
- (正式版)DB3302∕T 1180-2025 《高速公路建设韧性指标体系》
- 中康科技腾讯健康:2024年消费者健康洞察呼吸系列报告-鼻炎鼻窦炎篇预览版
- 2025年IT技术支持工程师招聘面试问题及答案解析
- 挤压模具工特殊工艺考核试卷及答案
- 2025-2026学年外研版八年级英语上册教学计划及进度表
- (2025年标准)灵活用工协议书
- 发廊租工位合同协议模板
- 服装厂质检知识培训内容课件
- 2025年教师资格考试趋势分析与模拟试题洞察未来方向(含答案)
- 2025浙江省旅游投资集团人才招聘17人(第四批)考试模拟试题及答案解析
- 上消化道出血药物指导
评论
0/150
提交评论