Android挖取原图手指触点区域RectF(并框线标记)放大到ImageView宽高与矩阵mapRadius,Kotlin

Android挖取原图手指触点区域RectF(并框线标记)放大到ImageView宽高与矩阵mapRadius,Kotlin

 

这里 Android挖取原图中心区域RectF(并框线标记)放大到ImageView宽高,Kotlin-CSDN博客 实现的是把原图中心区域的一片小图挖取出来放大放到下面的ImageView里面,现在不再固定中心位置,而是以手指在上图的触点位置为中心位置,挖取一片区域图放大,然后放到下面的ImageView里面。

 

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:background="@android:color/darker_gray"android:orientation="vertical"tools:context=".MainActivity"><com.pkg.MyImageViewandroid:id="@+id/iv"android:layout_width="match_parent"android:layout_height="wrap_content"android:adjustViewBounds="true"android:clickable="true"android:scaleType="fitCenter"android:src="@mipmap/image" /><ImageViewandroid:id="@+id/result"android:layout_width="match_parent"android:layout_height="wrap_content" /></LinearLayout>

 

 

import android.content.Context
import android.graphics.Bitmap
import android.graphics.BitmapFactory
import android.graphics.Canvas
import android.graphics.Color
import android.graphics.Matrix
import android.graphics.Paint
import android.graphics.Path
import android.graphics.RectF
import android.os.Bundle
import android.util.AttributeSet
import android.util.Log
import android.util.SizeF
import android.view.MotionEvent
import android.widget.ImageView
import androidx.appcompat.app.AppCompatActivity
import androidx.appcompat.widget.AppCompatImageView
import androidx.core.content.ContextCompat
import androidx.core.graphics.toRectclass MainActivity : AppCompatActivity() {override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContentView(R.layout.activity_main)val miv = findViewById<MyImageView>(R.id.iv)val iv = findViewById<ImageView>(R.id.result)miv.setResultImage(iv)}
}class MyImageView : AppCompatImageView {private var W = 0private var H = 0private val mSizeF = SizeF(400f, 200f)private var mOriginBmp: Bitmap? = nullprivate var mPaint = Paint()private var result: ImageView? = nullprivate var mTouchX = 0fprivate var mTouchY = 0fprivate var mCanDraw = falseprivate var mCircleRadius = 30fconstructor(ctx: Context, attrs: AttributeSet) : super(ctx, attrs) {mPaint.style = Paint.Style.STROKEmPaint.strokeWidth = 5fmPaint.isAntiAlias = truemPaint.color = Color.REDmOriginBmp = getOriginalBitmap(ctx, R.mipmap.image)Log.d("fly", "origin bmp w=${mOriginBmp!!.width} h=${mOriginBmp!!.height}")}private fun getOriginalBitmap(ctx: Context, resId: Int): Bitmap {val options = BitmapFactory.Options()options.inJustDecodeBounds = true //只解析原始图片的宽高,不decode原始文件装载到内存的Bitmap。BitmapFactory.decodeResource(resources, resId, options)//这一阶段,最关键的是获取原始图的真实宽高。val srcBmpWidth = options.outWidthval srcBmpHeight = options.outHeightval d = ContextCompat.getDrawable(ctx, resId)//根据原始图片的宽高创建一个空的Bitmapval bitmap = Bitmap.createBitmap(srcBmpWidth, srcBmpHeight, Bitmap.Config.ARGB_8888)val canvas = Canvas(bitmap)d?.setBounds(0, 0, srcBmpWidth, srcBmpHeight)d?.draw(canvas) //至此,bitmap即为原始图片。return bitmap}override fun onTouchEvent(event: MotionEvent?): Boolean {if (event == null) {return false}mTouchX = event.xmTouchY = event.ywhen (event.action) {MotionEvent.ACTION_UP, MotionEvent.ACTION_CANCEL -> {mCanDraw = truemyInvalidate()}}return super.onTouchEvent(event)}private fun myInvalidate() {this.invalidate()}fun setResultImage(iv: ImageView) {result = iv}override fun onSizeChanged(w: Int, h: Int, oldw: Int, oldh: Int) {super.onSizeChanged(w, h, oldw, oldh)W = wH = hLog.d("fly", "W=$W H=$H")}//从原始的Bitmap图中抠出一块SizeF大小的图。private fun getCenterBmp(): Bitmap {val bmp = Bitmap.createBitmap(W, H, Bitmap.Config.ARGB_8888)val c = Canvas(bmp)val dstRectF = RectF(0f, 0f, bmp.width.toFloat(), bmp.height.toFloat())//需要特别注意,要把手指在屏幕上触点坐标,经过比例映射到原始图Bitmap的对应位置。val mapToOriginBmpX = mOriginBmp!!.width * (mTouchX / W)val mapToOriginBmpY = mOriginBmp!!.height * (mTouchY / H)val centerRectF =RectF(mapToOriginBmpX - mSizeF.width / 2f,mapToOriginBmpY - mSizeF.height / 2f,mapToOriginBmpX + mSizeF.width / 2f,mapToOriginBmpY + mSizeF.height / 2f)c.drawBitmap(mOriginBmp!!, centerRectF.toRect(), dstRectF, null)val mx = Matrix()mx.setScale(dstRectF.width() / centerRectF.width(), dstRectF.width() / centerRectF.width())//下面图中的中心圆圈。mPaint.color = Color.YELLOWc.drawCircle(W / 2f, H / 2f,mx.mapRadius(mCircleRadius), //注意同步放大小图的圆圈半径。mPaint)return bmp}override fun onDraw(canvas: Canvas) {super.onDraw(canvas)if (mCanDraw) {//绘制中心圆圈。mPaint.color = Color.YELLOWcanvas.drawCircle(mTouchX, mTouchY, mCircleRadius, mPaint)drawRoundRectLine(canvas)result?.setImageBitmap(getCenterBmp())mCanDraw = false}}private fun drawRoundRectLine(canvas: Canvas) {val lineRectF = RectF(0f,0f,mSizeF.width,mSizeF.height)//原始图被Android系统拉伸放到屏幕上,所以lineRectF也需要进行相同的拉伸。val originBmpSizeMapMatrix = Matrix()originBmpSizeMapMatrix.setScale(getOriginBmpScaleToImageViewFactor(), getOriginBmpScaleToImageViewFactor())originBmpSizeMapMatrix.mapRect(lineRectF)lineRectF.offset(mTouchX - lineRectF.width() / 2f, mTouchY - lineRectF.height() / 2f)//绘制红色的lineRectF线框。val path = Path()path.addRoundRect(lineRectF, 20f, 20f, Path.Direction.CW)mPaint.color = Color.REDcanvas.drawPath(path, mPaint)}private fun getOriginBmpScaleToImageViewFactor(): Float {return (W.toFloat()) / (mOriginBmp!!.width)}
}

 

运行后,点击上图不同位置点:

94073d6938d1482e92943630bdf208ed.png

8b20029ee415471098ee822e6cd3deb5.png

11a57da761e046d1972c3d77dae2f643.png

 

 

 

 

 

Android BitmapFactory.decodeResource读取原始图片装载成原始宽高Bitmap,Kotlin_bitmapfactory解码宽高-CSDN博客文章浏览阅读856次。文章浏览阅读1.8k次。/*Java代码 将Drawable转化为Bitmap */ Bitmap drawableToBitmap(Drawable drawable) { int width = drawable.getIntrinsicWidth();Android Drawable 转化成 Bitmap-CSDN博客。_bitmapfactory解码宽高https://blog.csdn.net/zhangphil/article/details/134449577

Android挖取原图中心区域RectF(并框线标记)放大到ImageView宽高,Kotlin-CSDN博客文章浏览阅读395次,点赞11次,收藏11次。文章浏览阅读853次。【代码】Android矩阵setRectToRect裁剪Bitmap原图Matrix放大,mapRect标记中心区域,Kotlin。Android BitmapFactory.decodeResource读取原始图片装载成原始宽高Bitmap,Kotlin_bitmapfactory解码宽高-CSDN博客。Android矩阵setRectToRect裁剪Bitmap原图Matrix放大,mapRect标记中心区域,Kotlin-CSDN博客。https://blog.csdn.net/zhangphil/article/details/136157116

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/505712.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

unity学习(44)——选择角色菜单——顺利收到服务器的数据

本节的思路参考自&#xff0c;内容并不相同&#xff1a;13ARPG网络游戏编程实践&#xff08;十三&#xff09;&#xff1a;角色选择UI及创建面板制作&#xff08;四&#xff09;_哔哩哔哩_bilibili 现在的代码写在MessageManager.cs中&#xff0c;函数名UserHandler(是从OnMess…

JAVA *数据库连接池 * 接JDBC

一.介绍: 数据库连接池实际上就是一个 " 容器 " 当有多个拥护需要访问数据库的时候, 一个用户会打开一个数据库连接, 但是!当用户离开的时候,就会断开数据库连接,那么数据库连接就作废了,之后如果还有用户需要进行访问,需要再建立一个数据库连接......循环往复, …

web基础03-JavaScript

目录 一、JavaScript基础 1.变量 2.输出 3.变量提升 4.区块 5.JavaScript数据类型 6.查看数值类型 7.undefined和null 8.布尔值 9.和的区别 10.算数/三元/比较/逻辑/赋值运算符 11.特殊字符 12.字符串 &#xff08;1&#xff09;获取字符串长度 &#xff08;2&am…

聚观早报 | 2024款腾势D9将发布;岚图汽车2月销量

聚观早报每日整理最值得关注的行业重点事件&#xff0c;帮助大家及时了解最新行业动态&#xff0c;每日读报&#xff0c;就读聚观365资讯简报。 整理丨Cutie 3月2日消息 2024款腾势D9将发布 岚图汽车2月销量 苹果Vision Pro防汗新专利 真我12 Pro正式开售 Redmi K70/Pro…

Java面试——Redis

优质博文&#xff1a;IT-BLOG-CN 一、Redis 为什么那么快 【1】完全基于内存&#xff0c;绝大部分请求是纯粹的内存操作&#xff0c;非常快速。数据存在内存中。 【2】数据结构简单&#xff0c;对数据操作也简单&#xff0c;Redis中的数据结构是专门进行设计的。 【3】采用单线…

win11系统中nginx简单的代理配置

一.背景 为了公司安排的师带徒任务。 操作系统版本&#xff1a;win11家庭版 nginx版本&#xff1a;1.24.0 二.配置代理 之前文章已经说明了nginx简单的安装&#xff0c;要看阅读这个文章哈。web服务器nginx下载及在win11的安装-CSDN博客 1.配置需求识别 前端服务nginx(80…

web开发:如何用Echarts来自动给网页设计各种统计图

很多时候web开发也会需要用到统计图&#xff0c;如果单纯靠我们自己那点拙劣的css和js水平设计的话&#xff0c;又耗时间又做得跟史一样&#xff0c;这时候就需要引入别人设计师为我们设计好的动态统计图——echarts Echarts的官网是&#xff1a;Apache ECharts 1、第一步&…

从下一代车规MCU厘清存储器的发展(1)

目录 1.车规MCU制程工艺朝28nm进发 2.MCU存储器概述 3.MCU大厂的选择 3.1 瑞萨自研STT-MRAM 3.2 ST专注PCM 3.3 英飞凌和台积电联手RRAM 3.4 NXP如何计划eNVM 4.小结 1.车规MCU制程工艺朝28nm进发 随着英飞凌发布了关于AURIX TC4xx系列即将量产的新闻&#xff0c;国际…

基于yolov8与pyqt5的火焰烟雾实时检测系统设计

界面 权重&#xff1a;可以选择自己训练的yolov8模型&#xff0c;也可以用一些改进的yolov8模型作为系统的权重。 功能&#xff1a;单张图片的检测&#xff0c;视频文件的检测&#xff0c;多张图片同时检测&#xff0c;以及摄像头实时检测。 调整&#xff1a;可以调整置信度&…

XSS初级漏洞靶场

一、环境的搭建 可以在githb上找靶机包&#xff0c;使用小皮面板搭建在自己本机 与此文章类似&#xff08;放在www目录下&#xff09; 二、XSS漏洞简介 1、什么是xss漏洞 当用户访问被xss注入的网页&#xff0c;xss代码就会被提取出来。用户浏览器就会解析这段xss代码&…

FNM和SFNM的区别

看图说话。 级联模式下&#xff0c;FNM模式&#xff0c;从片的中断都是同一个级别&#xff0c;因此从片如果有多个中断发生&#xff0c;中断之间不会抢占&#xff0c;只能按顺序处理。 级连模式下&#xff0c;SFNM模式&#xff0c;从片中断有优先级的区别&#xff0c;高优先级…

选购墨水屏电子会议桌牌的技巧分享

在现代商务会议中&#xff0c;电子会议桌牌已经成为了不可或缺的工具。而在众多电子会议桌牌中&#xff0c;墨水屏电子会议桌牌因其独特的显示效果和节能特性受到了广泛关注。那么&#xff0c;面对市场上琳琅满目的产品&#xff0c;深圳金之桥信息如何选择一款适合自己的墨水屏…