【Android】Bitmap图片旋转、缩放、翻转等变换(90/100)

这篇具有很好参考价值的文章主要介绍了【Android】Bitmap图片旋转、缩放、翻转等变换(90/100)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

android bitmap旋转,android开发,android,java,UI,BitmapUtils,自定义View
自定义BitmapChangeView:

package top.lc951.myandroid.views;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.support.annotation.Nullable;
import android.util.AttributeSet;
import android.view.View;

import top.lc951.myandroid.utils.BitmapUtil;

/**
 * @author lichong
 * 2022年07月27日15:38:28
 */
public class BitmapChangeView extends View {
    public static final String TAG = BitmapChangeView.class.getSimpleName();

    private float mScaleRatio=1.0f;
    private float mRotateDegree=0;
    private Bitmap mBitmap;
    private int mBitmapWidth;
    private int mBitmapHeight;
    private int mOffsetX;
    private int mOffsetY;

    public BitmapChangeView(Context context) {
        super(context);
    }

    public BitmapChangeView(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
    }
    // 设置位图对象
    public void setImageBitmap(Bitmap bitmap) {
        mBitmap = bitmap;
        mBitmapWidth = mBitmap.getWidth();
        mBitmapHeight = mBitmap.getHeight();
        postInvalidate(); // 立即刷新视图(线程安全方式)
    }

    // 左右翻转图像
    public void flip() {
        // 水平翻转图像,也就是把镜中像左右翻过来
        mBitmap = BitmapUtil.getFlipBitmap(mBitmap);
        postInvalidate(); // 立即刷新视图(线程安全方式)
    }

    // 设置缩放比例。isReset为true表示按照原始尺寸进行缩放,为false表示按照当前尺寸进行缩放
    public void setScaleRatio(float ratio, boolean isReset) {
        if (isReset) {
            mScaleRatio = ratio;
        } else {
            mScaleRatio *= ratio;
        }
        postInvalidate(); // 立即刷新视图(线程安全方式)
    }
    // 设置旋转角度。isReset为true表示按照原始方向进行旋转,为false表示按照当前方向进行缩放
    public void setRotateDegree(int degree, boolean isReset) {
        if (isReset) {
            mRotateDegree = degree;
        } else {
            mRotateDegree += degree;
        }
        postInvalidate(); // 立即刷新视图(线程安全方式)
    }

    // 设置偏移距离。isReset为true表示按照原始位置进行移动,为false表示按照当前位置进行移动
    public void setOffset(int offsetX, int offsetY, boolean isReset) {
        if (isReset) {
            mOffsetX = offsetX;
            mOffsetY = offsetY;
        } else {
            mOffsetX += offsetX;
            mOffsetY += offsetY;
        }
        postInvalidate(); // 立即刷新视图(线程安全方式)
    }

    @Override
    protected void onDraw(Canvas canvas) {
        if (mBitmap == null) {
            return;
        }
        int width = getMeasuredWidth(); // 获取视图的实际宽度
        int height = getMeasuredHeight(); // 获取视图的实际高度
        int new_width = (int) (mBitmapWidth * mScaleRatio);
        int new_height = (int) (mBitmapHeight * mScaleRatio);
        Bitmap bitmap = mBitmap;
        if (mScaleRatio != 1) {
            // 生成缩放后的位图对象
            bitmap = BitmapUtil.getScaleBitmap(mBitmap, mScaleRatio);
        }
        if (mRotateDegree != 0) {
            // 生成旋转后的位图对象
            bitmap = BitmapUtil.getRotateBitmap(bitmap, mRotateDegree);
        }
        // 在画布上的指定位置绘制位图对象
        canvas.drawBitmap(bitmap, (width - new_width) / 2 + mOffsetX,
                (height - new_height) / 2 + mOffsetY, new Paint());
    }
}

工具类:

// 水平翻转图像,也就是把镜中像左右翻过来
    public static Bitmap getFlipBitmap(Bitmap bitmap) {
        Matrix matrix = new Matrix(); // 创建操作图片用的矩阵对象
        matrix.postScale(-1, 1); // 执行图片的旋转动作
        // 创建并返回旋转后的位图对象
        return Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(),
                bitmap.getHeight(), matrix, false);
    }
// 获得比例缩放之后的位图对象
    public static Bitmap getScaleBitmap(Bitmap bitmap, double scaleRatio) {
        Matrix matrix = new Matrix(); // 创建操作图片用的矩阵对象
        matrix.postScale((float) scaleRatio, (float) scaleRatio);
        // 创建并返回缩放后的位图对象
        return Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(),
                bitmap.getHeight(), matrix, false);
    }


// 获得旋转角度之后的位图对象
    public static Bitmap getRotateBitmap(Bitmap bitmap, float rotateDegree) {
        Matrix matrix = new Matrix(); // 创建操作图片用的矩阵对象
        matrix.postRotate(rotateDegree); // 执行图片的旋转动作
        // 创建并返回旋转后的位图对象
        return Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(),
                bitmap.getHeight(), matrix, false);
    }

布局引用:

<top.lc951.myandroid.views.BitmapChangeView
        android:id="@+id/view_bitmap_change"
        android:layout_width="match_parent"
        android:layout_height="200dp"
        app:layout_constraintStart_toStartOf="@id/tv_scale"
        app:layout_constraintTop_toBottomOf="@id/ck_flip" />

应用如下:

package top.lc951.myandroid.activity;

import android.content.Context;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Environment;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.Spinner;
import android.widget.Toast;

import top.lc951.myandroid.R;
import top.lc951.myandroid.utils.BitmapUtil;
import top.lc951.myandroid.views.BitmapChangeView;

/**
 * 图片翻转、缩放、旋转等
 * */
public class BitmapChangeActivity extends AppCompatActivity {

    private BitmapChangeView bitmapChangeView;
    public static void actionActivity(Context context) {
        Intent intent = new Intent(context, BitmapChangeActivity.class);
        context.startActivity(intent);
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_bitmap_change);

        CheckBox flipCb = findViewById(R.id.ck_flip);
        bitmapChangeView=findViewById(R.id.view_bitmap_change);
        flipCb.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                bitmapChangeView.flip();
            }
        });

        Button saveBtn=findViewById(R.id.btn_save_image);
        saveBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Bitmap bitmap = bitmapChangeView.getDrawingCache(); // 从绘图缓存获取位图对象
                // 生成图片文件的保存路径
//                String path = String.format("%s/%s.jpg",
//                        getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS).toString(),
//                        DateUtil.getNowDateTime());
//                BitmapUtil.saveImage(path, bitmap); // 把位图保存为图片文件
//                BitmapUtil.notifyPhotoAlbum(this, path); // 通知相册来了张新图片
//                Toast.makeText(this, "成功保存图片文件:" + path, Toast.LENGTH_LONG).show();
            }
        });

        initScaleSpinner();
        initRotateSpinner();
    }

    @Override
    protected void onStart() {
        super.onStart();
        bitmapChangeView.setDrawingCacheEnabled(true);
        Bitmap bitmap= BitmapFactory.decodeResource(getResources(),R.mipmap.ic_img06);
        bitmapChangeView.setImageBitmap(bitmap);
    }

    @Override
    protected void onStop() {
        super.onStop();
        bitmapChangeView.setDrawingCacheEnabled(false);
    }
    private String[] scaleArray = {"0.25", "0.5", "0.75", "1.0", "1.5", "2.0", "4.0"};
    private String[] rotateArray = {"0", "45", "90", "135", "180", "225", "270", "315"};

    private void initRotateSpinner() {
        ArrayAdapter<String> scaleAdapter = new ArrayAdapter<>(this,
                android.R.layout.simple_list_item_1, rotateArray);
        Spinner sp_scale = findViewById(R.id.spinner_rotate);
        sp_scale.setPrompt("请选择旋转角度");
        sp_scale.setAdapter(scaleAdapter);
        sp_scale.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
            @Override
            public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
                bitmapChangeView.setRotateDegree(Integer.parseInt(rotateArray[position]), true);

            }

            @Override
            public void onNothingSelected(AdapterView<?> parent) {

            }
        });
        sp_scale.setSelection(0);
    }

    private void initScaleSpinner() {
        ArrayAdapter<String> scaleAdapter = new ArrayAdapter<>(this,
                android.R.layout.simple_list_item_1, scaleArray);
        Spinner sp_scale = findViewById(R.id.spinner_scale);
        sp_scale.setPrompt("请选择缩放比率");
        sp_scale.setAdapter(scaleAdapter);
        sp_scale.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
            @Override
            public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
                bitmapChangeView.setScaleRatio(Float.parseFloat(scaleArray[position]), true);

            }

            @Override
            public void onNothingSelected(AdapterView<?> parent) {

            }
        });
        sp_scale.setSelection(3);
    }
}

自研产品推荐

推荐理由

postman在国内使用已经越来越困难:
1、登录问题严重
2、Mock功能服务基本没法使用
3、版本更新功能已很匮乏
4、某些外力因素导致postman以后能否使用风险较大
出于以上考虑因此笔者自己开发了一款api调试开发工具SmartApi,满足基本日常开发调试api需求

简介

历时一年半多开发终于smartApi-v1.0.0版本在2023-09-15晚十点正式上线
smartApi是一款对标国外的postman的api调试开发工具,由于开发人力就作者一个所以人力有限,因此v1.0.0版本功能进行精简,大功能项有:

  • api参数填写
  • api请求响应数据展示
  • PDF形式的分享文档
  • Mock本地化解决方案
  • api列表数据本地化处理
  • 再加上UI方面的打磨

下面是一段smartApi使用介绍:
android bitmap旋转,android开发,android,java,UI,BitmapUtils,自定义View

下载地址:

https://pan.baidu.com/s/1kFAGbsFIk3dDR64NwM5y2A?pwd=csdn文章来源地址https://www.toymoban.com/news/detail-575242.html

到了这里,关于【Android】Bitmap图片旋转、缩放、翻转等变换(90/100)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【C++ OpenCV】图像变换:连接、尺寸、翻转、旋转、仿射变换

    目录 图像缩放变换 图像翻转 图像拼接 纵向拼接 横向拼接 图像插值原理 作用 单线性插值 双线性插值的公式 双线性插值的例子 双线性插值的直观展示 意义 仿射变换 图像旋转 实操 一、实现图像旋转 二、根据定义的三个点实现仿射变换,并且求取仿射变换矩阵 源码 src -

    2024年01月18日
    浏览(36)
  • Python图像处理丨图像缩放、旋转、翻转与图像平移

    摘要: 本篇文章主要讲解Python调用OpenCV实现图像位移操作、旋转和翻转效果,包括四部分知识:图像缩放、图像旋转、图像翻转、图像平移。 本文分享自华为云社区《[Python图像处理] 六.图像缩放、图像旋转、图像翻转与图像平移》,作者:eastmount 。 本篇文章主要讲解Pyth

    2024年02月06日
    浏览(42)
  • Opencv-C++笔记 (16) : 几何变换 (图像的翻转(镜像),平移,旋转,仿射,透视变换)

    图像旋转是指图像按照某个位置转动一定的角度的过程,旋转中图像仍保持着原始尺寸。图像旋转后图像水平对称轴、垂直对称轴及中心坐标原点都可能会发生变换,因此需要对图像旋转中的坐标进行相应转换。 假设有一个点:P(x,y),它在绕原点 O(0,0) 旋转 β 后,被转换成

    2024年02月14日
    浏览(38)
  • 仿射变换中的旋转缩放变换矩阵推导

    仿射变换可以将矩阵形状转换为平行四边形。可以挤压形状,但是必须保持两边平行。常见的是旋转、缩放、平移变换。缩放和平移比较简单,本文重点推导旋转缩放变换矩阵。 任意一点 ( x 0 , y 0 ) (x_0,y_0) ( x 0 ​ , y 0 ​ ) 可以看成 ( x 0 , 0 ) (x_0, 0) ( x 0 ​ , 0 ) 向量和 ( 0 ,

    2024年04月24日
    浏览(31)
  • pygame图像变换:缩放、旋转、镜像

    pygame的transform中封装了一些基础的图像处理函数,列表如下 函数 功能 flip 镜像 scale 缩放至新的分辨率 scale_by 根据因子进行缩放 scale2x 专业图像倍增器 rotate 旋转 rotozoom 缩放并旋转 smoothscale 平滑缩放 smoothscale_by 平滑缩放至新的分辨率 chop 获取已删除内部区域的图像的副本

    2024年02月04日
    浏览(30)
  • 【OpenCV】图像变换(缩放、平移、旋转、仿射)

    图像变换是指通过对图像进行缩放、平移、旋转、仿射、透视等变换来改变图像的形状和大小。在本篇博客中,我们将详细介绍OpenCV中的图像变换函数,并提供示例代码以帮助读者更好地理解这些函数的使用方法。 缩放变换是指通过改变图像的大小来改变图像的形状。在Op

    2024年02月07日
    浏览(39)
  • 二维坐标基本变换(平移、旋转、缩放、镜像、阵列)

    诸如图像、模型等的基本变换,实际上都是点坐标的变换,通过矩阵,可以非常方便的达到这个目的。在下文仅介绍二维坐标变换原理。 首先,定义点类如下: 注意,为了形式统一,变换矩阵应统一为3*3阶,同理,对于三维坐标变换矩阵应是4*4阶。关于矩阵的表示,实际上

    2024年02月04日
    浏览(63)
  • OpenCV图像的仿射变换、旋转和缩放

    以下是对代码的逐行解释:

    2024年02月13日
    浏览(31)
  • Halcon用矩阵实现图像变换(平移,旋转,缩放,镜像等)

    目录 图像变换介绍  用Halcon自带的算子实现图像变换 使用矩阵来实现相关算子的功能 一、平移 二、旋转 三、缩放 四、镜像 完整代码         在halcon中经常会用到图像变换的操作,然后这次作业是用矩阵来实现相关算子的功能,学到了挺多的所以就记录下来方便复习。

    2024年04月17日
    浏览(30)
  • opencv006图像处理之仿射变换(旋转,缩放,平移)

    空间变换中的仿射变换对应着五种变换,平移,缩放,旋转,翻转,错切。而这五种变化由原图像转变到变换图像的过程,可以用仿射变换矩阵进行描述。而这个变换过程可以用一个2*3的矩阵与原图进行相乘得到。关键就是这个矩阵M:  平移,旋转   透视 M: 变换矩阵 desi

    2024年01月21日
    浏览(32)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包