【问题标题】:Android Image Annotation Bitmap issueAndroid图像注释位图问题
【发布时间】:2021-02-22 04:06:15
【问题描述】:

我正在创建一个基本媒体库,其中一个功能是图像注释。我从 android 存储系统获取媒体文件,然后将其转换为位图。然后我从位图创建一个画布,并使用画布类的 drawLine 函数来允许基本注释。我目前遇到的问题是画布和图像大小不同,因此线条绘制在错误的位置。

这是创建位图的代码。

val bmpFactoryOptions = BitmapFactory.Options()
                bmpFactoryOptions.inJustDecodeBounds = false
                bmp = (BitmapFactory.decodeFile(it.mediaUrl)).rotate(270f)

                alteredBitmap = Bitmap.createBitmap(
                    bmp!!.width, bmp!!
                        .height, bmp!!.config
                )

然后我创建画布、绘画和矩阵对象。

canvas = Canvas(alteredBitmap!!)
paint = Paint()
paint!!.color = Color.GREEN
paint!!.strokeWidth = 5f
matrix = Matrix()
canvas!!.drawBitmap(bmp!!, matrix!!, paint)

然后我将 changedBitmap 设置为图像视图的图像

annotateIV!!.setImageBitmap(alteredBitmap)

最后一个出错的地方是 imageView 的 touchListener。

annotateIV!!.setOnTouchListener { view, motionEvent ->
                    when (motionEvent.action) {
                        ACTION_DOWN -> {
                            downx = motionEvent.x
                            downy = motionEvent.y
                        }
                        ACTION_MOVE -> {
                            upx = motionEvent.x
                            upy = motionEvent.y
                            canvas!!.drawLine(downx, downy, upx, upy, paint!!)
                            annotateIV!!.invalidate()
                            downx = upx
                            downy = upy
                        }
                        ACTION_UP -> {
                            upx = motionEvent.x
                            upy = motionEvent.y
                            canvas!!.drawLine(downx, downy, upx, upy, paint!!)
                            annotateIV!!.invalidate()
                        }
                        ACTION_CANCEL -> {
                        }
                        else -> {

                        }
                    }
                    return@setOnTouchListener true
                }

我尝试以不同的方式创建位图,但经常遇到相同的缩放错误。 Image Example of Error 注意左上角绘制的线条。这些是在尝试在整个屏幕上绘制时创建的。

感谢任何人的关注,非常感谢任何帮助。

对位图的创建进行了调整。这会导致图像被放大,但至少在正确的位置绘制线条

bmp = (BitmapFactory.decodeFile(it.mediaUrl)).rotate(270f)

                alteredBitmap = Bitmap.createBitmap(
                    bmp!!.width, bmp!!
                        .height, bmp!!.config
                )
                alteredBitmap = Bitmap.createScaledBitmap(alteredBitmap!!, annotateIV.width, annotateIV.height, false)

【问题讨论】:

    标签: android image kotlin canvas bitmap


    【解决方案1】:

    您的Canvas 的大小为Bitmap,可能比您的屏幕尺寸大得多。您将Bitmap 设置为annotateIV,我假设它是ImageView 并设置了一些scaleType 以适应整个Bitmap 内部视图。这实际上仍然没有调整Bitmap/Canvas 的大小,它只是一个“预览”

    为了解决这个问题,您应该将您的 Bitmap 缩放到 ImageView 的大小,或者制作一些 bitmapSize/imageViewSize 的因子/比率值并将所有 motionEvent.xmotionEvent.y 乘以它

    顺便说一句。当每个MotionEvent 到达时调用invalidate() 不是有效的方法......这就是为什么你的线不是圆的,它显然是用直线制成的

    【讨论】:

    • alteredBitmap = Bitmap.createBitmap( annotateIV.width, annotateIV.height, bmp!!.config ) 我将位图创建更改为这个,现在图像非常放大,但线条被绘制在屏幕上的正确区域。如果可能的话,你能否澄清你的帖子最后一部分的意思。非常感谢
    • 关于invalidate()?您对每个新的MotionEvent 都调用此方法,但绘制需要时间。上一次运行期间的每个下一个invalidate 调用只是被省略了,因为 UI 挂在上一个操作上,因此你失去了一些要绘制的点 - 这在你的绿线的底部清晰可见,它由几条直线组成(“点已连接”),不像您的手指在屏幕上移动那样圆润
    • 对位图调整大小和/或使用motionEvents的比率感到抱歉。我将如何实施呢?我尝试使用 createScaledBitmap,这导致图像被放大,但至少线条被绘制在正确的位置。
    • 但是对于无效,您建议多久调用一次?
    • 像以前一样加载您的Bitmap,但之后使用Bitmap.createScaledBitmap 方法并将其缩放到ImageView 的大小。使用Bitmap.createBitmap( annotateIV.width, annotateIV.height,...,您只加载了Bitmap 的一部分,设置在ImageView 上看起来像放大了
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多