android基础图像处理

万事开头难,想写博客应该是这学期第一个月左右的想法,但因为懒得打字,拖延到这个时候。上周学习android图像处理,在这里再做一下总结。

学习之前

了解android界面中的X轴与Y轴:
Android界面XY轴

常用绘图类

画笔-Paint

用来描述图形的颜色和风格,如线宽、颜色、透明度和填充效果等信息。
主要方法:
1.setAntiAlias(boolean aa)
用于指定是否使用抗锯齿功能,如果使用会使绘图速度变慢
2.setShader(Shader shader)
用于设置渐变,可以使用LinearGradient(线性渐变),RadialGradient(径向渐变)或者SweepGradient(角度渐变)
3..setShadowLayer(float radius,float dx,float dy,int color)
用于设置阴影,参数radius为阴影的角度,dx和dy为阴影在X轴和y轴上的距离,color为阴影的颜色。如果radius的参数值为0,那么将没有阴影
4..setStrokeWidth(float width)
用于设置笔触的宽度
5..setStyle(Paint.Style style)
用于设置填充风格,参数值为Style.Fill、Style.Fill_AND_STROKE或Style.STROKE
6..setTextSize(float textSize)
用于设置绘制文本是文字的大小
7.setXfermode(Xfermode xfermode)
用于设置图形重叠时的处理方式、例如合并、取交集或并集,经常用来制作橡皮的擦除效果

画布-Canvas

Canvans类代表画布,通过该类提供的方法,可以绘制各种图形(例如:矩形、圆形和线条等)。通常情况下,要在Android中绘图,需要先创建一个继承自View类的视图,并且在该类中重写它的onDraw(Canvans canvans)方法,然后在显示绘图的Activity中添加该视图。
ps:
View有3个构造方法(可能以后会更多),如下:
1. View(Context context) 生成控件
2. View(Context context, @Nullable AttributeSet attrs) XML布局文件中插入控件
3. View(Context context, @Nullable AttributeSet attrs, int defStyleAttr)
第三个参数defStyleAttr的意义是从APP或者Activity的Theme中设置的该控件的属性的默认值

位图-Bitmap

Bitmap类代表位图,它是Android系统中图像处理最重要的类之一。使用它不仅可以获取图像文件信息,进行图像剪切、旋转、缩放等操作,而且还可以指定格式保存图像文件
主要方法:
1.compress(Bitmap.CompressFormat dormat,int quality,OutputStream stream)
用于将Bitmap对象压缩为指定格式并保存到指定的文件输出中,其中format参数值可以是Bitmap.CompressFormat.PNG、Bitmap.CompressFormat.JPEG和Bitmap.CompressFormat.WEBP
2.createBitmap(Bitmap source,int x,int y,int width,int heigh,Matrix m,Boolean filter)
用于从源位图的指定坐标点开始,“挖取”指定宽度和高度的一块图像来创建新的Bitmap对象,并按Matrix指定规划进行交换
3.createBitmap(int width,int heigh, Bitmap.Config config)
用于创建一个指定宽度和高度的新的Bitmap对象
4.createBitmap(Bitmap source,int x,int y,int width,int heigh)
用于从源位图的指定坐标点开始,“挖取”指定宽度和高度的一块图像来创建新的Bitmap对象
5.createBitmap(int[] colors,int width,int heigh, Bitmap.Config config)
使用颜色数组创建一个指定宽度和高度的新Bitmap对象,其中,数组元素的个数为width*height
6.createBitmap(Bitmap src)
用于使用源位图创建一个新的Bitmap对象
7.createScaleBitmap(Bitmap src,int dstwidth,int dstheigh, Boolean filter)
用于将源位图缩放为指定宽度和高度的新Bitmap对象
8.isRecyled()
用于判断Bitmap对象是否被回收
9.Recycle()
强制回收Bitmap对象

创建位图对象-BitmapFactory

用于从不同的数据源来解析,创建Bitmap类
主要方法:
1.decodeFile(String pathName)
用于从给定的路径所指定的文件中解析、创建Bitmap对象
2.decodeFileDescriptor(FileDescriptor fd)
用于从FileDescriptor对应的文件中解析、创建Bitmap对象
3.decodeResource(Resource res,int id)
用于根据给定的资源ID从指定的资源中解析、创建Bitmap对象
4.decodeStream(InputStream is)
用于从指定的输入流中解析创建Bitmap对象
ps:
Resources对象获取:
在一个Acitvity或者一个Service中,我们直接this.getResources()方法,就可以获得Reousrces对象。其实Acitivity或者Service本质上就是一个Context,getResources()方法来自Context,而真正实现Context接口是ContextImpl类,所以调用的实际上时ContextImpl类的getResources()方法。
比如,要解析Drawable中的图片image.jpg:
Bitmap bitmap = BitmapFactory.decodeResource(getResources(),R.drawable.image);
Context继承关系

绘制2D图像中的几点注意

1.Paint.Style.
Paint.Style.FILL:填充内部
Paint.Style.FILL_AND_STROKE :填充内部和描边
Paint.Style.STROKE :描边
这里写图片描述
2.Paint.Cap.
这里写图片描述
3.Paint.Join.
这里写图片描述

常见图像特效变换公式

旋转、缩放、倾斜、平移:都是创建一个Matrix进行某一个操作,然后set**、pre**、post**方法,最后再用方法
canvas.drawBitmap(bitmap,matrix,paint)应用变换到位图中。

主要说两点:

1.缩放公式:
点(x,y)以setScale(sx, sy, px, py)方法缩放之后公式:
x’ = px-(px-x)*sx
y’ = py-(py-y)*sy
2.倾斜公式:
点(x,y)以setSkew(kx,ky,px,py)方法 倾斜之后公式:
x’ = kx*(y-py)+x
y’ = ky*(x-px)+y
欢迎大家验证讨论

最后附上利用seekbar可以自由变换圆角角度的小例子:

public class RoundCornerImage extends AppCompatActivity {
    private ImageView image_processing = null;
    private Bitmap bitmap;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.layout_roundcorner);

        SeekBar seekBar = (SeekBar) findViewById(R.id.seekBar_pixels);

        seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener(){
            @Override
            public void onStartTrackingTouch(SeekBar seekBar) {
                bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.example);
                image_processing = (ImageView) findViewById(R.id.image_processing);
            }
            @Override
            public void onProgressChanged(SeekBar seekBar, int progress,
                                          boolean fromUser) {
                image_processing.setImageBitmap(getRoundCornerImage(bitmap, progress));
            }
            public void onStopTrackingTouch(SeekBar seekBar) {
                bitmap.recycle();
            }
        });
    }

    public static Bitmap getRoundCornerImage(Bitmap bitmap,int roundPixels){
        //创建一个和原始图片一样大小位图
        Bitmap roundCornerImage = Bitmap.createBitmap(bitmap.getWidth(),
        bitmap.getHeight(), Bitmap.Config.ARGB_8888);//ARGB_8888就是由4个8位组成即32位
        //创建带有位图roundConcerImage的画布
        Canvas canvas = new Canvas(roundCornerImage);
        //创建画笔
        Paint paint = new Paint();
        //创建一个和原始图片一样大小的矩形
        Rect rect = new Rect(0, 0, bitmap.getWidth(), bitmap.getHeight());
        RectF rectF = new RectF(rect);
        // 去锯齿
        paint.setAntiAlias(true);
        //画一个和原始图片一样大小的圆角矩形
        canvas.drawRoundRect(rectF, roundPixels, roundPixels, paint);
        //设置相交模式
        PorterDuffXfermode porterDuffXfermode = new PorterDuffXfermode(PorterDuff.Mode.SRC_IN);

        paint.setXfermode(porterDuffXfermode);
        //把图片画到矩形中
        canvas.drawBitmap(bitmap, null, rect, paint);
        return roundCornerImage;
    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值