java – ImageView坐标与位图像素之间的对应关系 – Android

在我的应用程序中,我希望用户能够选择 ImageView中包含的图像的某些内容.

要选择内容,我将ImageView类子化,使其实现OnTouchListener,以便绘制一个带有用户决定的边框的矩形.

这是一个绘图结果的例子(有一个想法,如何工作,你可以想到它,当你点击鼠标在桌面上拖动鼠标):

现在我需要确定位图图像的哪些像素对应于所选的部分.这是很容易确定哪些是ImageView属于矩形的点,但我不知道如何获取通信像素,因为ImageView具有不同于原始图像的长宽比.

我遵循了描述especially here,but also here的方法,但我不完全满意,因为在我看来,ImageView上的对应关系是像素和点之间的1比1,并且不会将原始图像上的所有相应像素给出到所选区域.

调用hovedRectViewViewView上的矩形是:

class Point {
    float x,y;
    @Override
    public String toString() {
        return x + "," + y;
    }
}

Vector<Point> pointsInRect = new Vector<Point>();

for( int x = hoveredRect.left; x <= hoveredRect.right; x++ ){
    for( int y = hoveredRect.top; y <= hoveredRect.bottom; y++ ){

        Point pointInRect = new Point();
        pointInRect.x = x;
        pointInRect.y = y;
        pointsInRect.add(pointInRect);
    }   
}

如何获取矢量<像素> pixelInImage包含Bitmap图像的相应像素?

补充说明

我会解释一下我的问题的上下文:

I need to do some image processing on the selected part,and want to
be sure that all the pixels in the rectangle get processed.

The image processing will be done on a server but it needs to know exactly which
pixels to process. Server works with image with real dimensions,
android app just tells which pixels to process to the server by passing a vector
containing the pixel coordinates

为什么我不喜欢上述链接中提出的解决方案:

The answers given transform coordinates with a 1 to 1 fashion. This approach clearly is
not valid for my task,since an area of say 50 points in the ImageView of a certain
size on the screen cannot correspond to an area of the same number of pixels in the real
image,but should consider the different aspect ratio.

例如,如果图像小于应用程序上显示的ImageView,则应选择该区域:

解决方法

利玛窦,

这似乎是一个问题,您可以(主观地)容忍您发送到服务器的像素有多少错误.事实上,对于任何不会出现一个漂亮整洁整数的宽高比,您必须决定“推”选择框的方向.

您链接的解决方案是完美的解决方案.你必须问自己:用户是否注意到,如果我处理的图像是从屏幕上显示的选择框中的一个像素?我的猜测可能不是当用触摸屏上的大胖手指选择一个矩形时,我无法想像用户将具有像素精度:D

由于是这种情况,所以我可以让抛出一个整数时发生的floor() – 来处理最终传递给服务器的像素.

我们来看一个例子.

让我们将ImageView和Bitmap的宽度和高度定义为:

ImageViewWidth = 400,ImageViewHeight = 150
BitmapWidth = 176,BitmapHeight = 65

然后,您将使用它们在其间转换选择框的宽高比为:

WidthRatio = BitmapWidth / ImageViewWidth = 175 / 400 = 0.44
HeightRatio = BitmapHeight / ImageViewHeight = 65 / 150 = 0.44

一些不错的丑陋的数字. ImageView中的任何像素都将对应于Bitmap中的像素,如下所示:

BitmapPixelX = ImageViewPixelX * WidthRatio
BitmapPixelY = ImageViewPixelY * HeightRatio

现在我把这个Bitmap放在我的ImageView的屏幕上,供用户选择一个矩形,用户在ImageView中选择一个有左上角和右下角坐标的矩形:

RectTopLeftX = 271,RectTopLeftY = 19
RectBottomRightX = 313,RectBottomRightY = 42

如何确定位图中哪些像素对应?简单.我们之前确定的比率.现在我们来看看左上角的坐标.

RectTopLeftX * WidthRatio = 271 * .44 = 119.24
RectTopLeftY * HeightRatio = 19 * .44 = 8.36

对于RectTopLeftX,我们发现我们的BitmapPixelX值为119,然后是四分之一的像素.那么,如果我们把这个值和对应的BitmapPixelY的值为8.36,我们将把像素(119,8)发送到服务器进行处理.如果我们要ceil()这些值,我们将发送像素(120,9)到服务器进行处理.这是完全取决于你的部分.

你将(几乎)总是落在像素的一些小数部分.无论你发送你所在的像素,还是旁边的像素是你的电话.我会说这是你的用户完全不明显的,所以要重申一下,只要让抛出一个整数就会发生的floor() – .

希望有帮助!

[编辑]

再次慢慢阅读这个问题,我想我更好的理解你的问题/困惑.我将用上面的例子来说明.

您说的是Bitmap中有176个像素,ImageView中有400个像素.因此,从一个到另一个的映射不是1:1,这将在找出要提取的像素进行处理时会产生问题.

但它不!当您将ImageView中的矩形边界的坐标转换为位图中的坐标时,您只需在“位图”中给出像素范围即可迭代.它不是描述ImageView中每个像素如何映射到Bitmap中相应的像素.

我希望清除我对你的困惑的困惑.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


ADB Remote ATV Android TV 的遥控器,基于 ADB Shell 命令 ADB Remote ATV 是一个 Android TV 的遥控器,基于 ADB Shell 命令,泛用性更高。 下面的 shell 命令,是软件的基本原理,通过 shell 命令可模拟物理遥控器的基本按
使用Flutter自带的SearchDelegate组件实现搜索界面,通过魔改实现如下效果:搜素建议、搜索结果,支持刷新和加载更多,解决IOS中文输入拼音问题。
上篇文章讲解了怎么使用Kotlin的协程配合Retrofit发起网络请求,使用也是非常方便,但是在处理请求异常还不是很人性化。这篇文章,我们将处理异常的代码进行封装,以便对异常情况返回给页面,提供更加友好的提示。 编写拓展方法 我们写一个扩展(全局)方法,就叫ViewModelExt.kt,在下面创
安卓开发——WebView+Recyclerview文章详情页,解决高度问题 最近在写一个APP时,需要显示文章详情页,准备使用WebView和RecyclerView实现上面文章,下面评论。出现了WebView高度问题,WebView加载HTML格式数据,而非URL。 这里的WebView为自定义
更新Android SDK到3.0版本时,遇到Failed to rename directory E:\android\tools to E:\android\temp\ToolPackage.old01问题,导致无法更新,出现该问题的原因是由于3.0版本与较早的sdk版本之间文件结构有冲突,解决
Android 如何解决dialog弹出时无法捕捉Activity的back事件 在一些情况下,我们需要捕捉back键事件,然后在捕捉到的事件里写入我们需要进行的处理,通常可以采用下面三种办法捕捉到back事件: 1)重写onKeyDown或者onKeyUp方法 2)重写onBackPressed方
Android实现自定义带文字和图片的Button 在Android开发中经常会需要用到带文字和图片的button,下面来讲解一下常用的实现办法。一.用系统自带的Button实现 最简单的一种办法就是利用系统自带的Button来实现,这种方式代码量最小。在Button的属性中有一个是drawable
Android中的&quot;Unable to start activity ComponentInfo&quot;的错误 最近在做一款音乐播放器的时候,然后在调试的过程中发现一直报这个错误&quot;Unable to start activity ComponentInfo&quot;,从字面
Android 关于长按back键退出应用程序的实现最近在做一个Android上的应用,碰到一个问题就是如何实现长按back键退出应用程序。在网上查找了很多资料,发现几乎没有这样的实现,大部分在处理时是双击back键来退出应用程序。参考了一下双击back键退出应用程序的代码,网上主流的一种方法是下面
android自带的时间选择器只能精确到分,但是对于某些应用要求选择的时间精确到秒级,此时只有自定义去实现这样的时间选择器了。下面介绍一个可以精确到秒级的时间选择器。 先上效果图: 下面是工程目录: 这个控件我也是用的别人的,好像是一个老外写的,com.wheel中的WheelView是滑动控件的主
Android平台下利用zxing实现二维码开发 现在走在大街小巷都能看到二维码,而且最近由于项目需要,所以研究了下二维码开发的东西,开源的二维码扫描库主要有zxing和zbar,zbar在iPos平台上应用比较成熟,而在Android平台上主流还是用zxing库,因此这里主要讲述如何利用zxing
Android ListView的item背景色设置以及item点击无响应等相关问题 在Android开发中,listview控件是非常常用的控件,在大多数情况下,大家都会改掉listview的item默认的外观,下面讲解以下在使用listview时最常见的几个问题。1.如何改变item的背景色和按
如何向Android模拟器中导入含有中文名称的文件在进行Android开发的时候,如果需要向Android模拟器中导入文件进行测试,通过DDMS下手动导入或者在命令行下通过adb push命令是无法导入含有中文文件名的文件的。后来发现借用其他工具可以向模拟器中导入中文名称的文件,这个工具就是Ultr
Windows 下搭建Android开发环境一.下载并安装JDK版本要求JDK1.6+,下载JDK成功后进行安装,安装好后进行环境变量的配置【我的电脑】-——&gt;【属性】——&gt;【高级】 ——&gt;【环境变量】——&gt;【系统变量】中点击【新建】:变量名:CLASSPATH变量值:……
如何利用PopupWindow实现弹出菜单并解决焦点获取以及与软键盘冲突问题 在android中有时候可能要实现一个底部弹出菜单,此时可以考虑用PopupWindow来实现。下面就来介绍一下如何使用PopupWindow实现一个弹出窗。 主Activity代码:public void onCreat
解决Android中的ERROR: the user data image is used by another emulator. aborting的方法 今天调试代码的时候,突然出现这个错误,折腾了很久没有解决。最后在google上找到了大家给出的两种解决方案,下面给出这两种方法的链接博客:ht
AdvserView.java package com.earen.viewflipper; import android.content.Context; import android.graphics.Bitmap; import android.graphics.BitmapFactory;
ImageView的scaleType的属性有好几种,分别是matrix(默认)、center、centerCrop、centerInside、fitCenter、fitEnd、fitStart、fitXY。 |值|说明| |:--:|:--| |center|保持原图的大小,显示在ImageVie
文章浏览阅读8.8k次,点赞9次,收藏20次。本文操作环境:win10/Android studio 3.21.环境配置 在SDK Tools里选择 CMAKE/LLDB/NDK点击OK 安装这些插件. 2.创建CMakeLists.txt文件 在Project 目录下,右键app,点击新建File文件,命名为CMakeLists.txt点击OK,创建完毕! 3.配置文件 在CMa..._link c++ project with gradle
文章浏览阅读1.2w次,点赞15次,收藏69次。实现目的:由mainActivity界面跳转到otherActivity界面1.写好两个layout文件,activity_main.xml和otherxml.xmlactivity_main.xml&lt;?xml version="1.0" encoding="utf-8"?&gt;&lt;RelativeLayout ="http://schemas..._android studio 界面跳转