在android上转换原始位图

Mak*_*ele 5 android

所以,我正在使用这个库https://github.com/thuytrinh/android-collage-views将“MultiTouchListener”功能添加到我的 ImageView。基本上,我让用户根据自己的需要使用旋转、缩放和平移来修改照片。现在唯一的问题是如何保存它。我是这样做的:

    Bitmap bitmap = Bitmap.createBitmap(imageContainer.getWidth(), imageContainer.getHeight(), Bitmap.Config.ARGB_8888);
    Canvas canvas = new Canvas(bitmap);
    canvas.drawColor(Color.WHITE);
    imageContainer.draw(canvas);
Run Code Online (Sandbox Code Playgroud)

它可以工作,但图像不够大 - 它与手机上的视图一样大,因此它取决于屏幕分辨率。我想在给定的全尺寸位图上“应用”这些转换。我希望转换后的图像在屏幕上看起来像(所以它需要裁剪屏幕外的所有内容)

我尝试了以下方法:

    Bitmap newBitmap = Bitmap.createBitmap(image.getWidth(), image.getHeight(), Bitmap.Config.ARGB_8888);
    Canvas canvas = new Canvas(newBitmap);
    canvas.drawColor(Color.WHITE);
    Paint paint = new Paint();
    paint.setAntiAlias(true);
    canvas.drawBitmap(image, imageView.getMatrix(), paint);
Run Code Online (Sandbox Code Playgroud)

但它看起来并不像预期的那样。

用户画面:

在此处输入图片说明

并输出图像(不裁剪,因为我不想裁剪哪一边):

在此处输入图片说明

我怎样才能解决这个问题?有什么解决办法吗?

mey*_*ety 4

这是一种方法,绝对不是完美的,但应该给你一个好的开始:

在此,container指的是包含转换后的视图ImageView、屏幕截图上的手机壳和src原始源位图。

  • 首先,您需要计算输出位图所需的宽度和高度,即在保持容器比例的同时使图像适合其中的大小:

    float containerWidth = containerView.getWidth();
    float containerHeight = containerView.getHeight();
    
    float srcWidth = src.getWidth();
    float srcHeight = src.getHeight();
    
    float containerRatio = containerWidth / containerHeight;
    float srcRatio = srcWidth / srcHeight;
    
    float outputWidth, outputHeight;
    
    if(srcRatio > containerRatio) { //fits in width
            outputWidth = srcWidth;
            outputHeight = srcWidth / containerRatio;
    }
    else if(srcRatio < containerRatio) { //fits in height
            outputHeight = srcHeight;
            outputWidth = srcHeight * containerRatio;
    }
    else {
        outputWidth = srcWidth;
        outputHeight = srcHeight;
    }
    
    Run Code Online (Sandbox Code Playgroud)
  • 将容器宽度/高度与输出宽度/高度之间的比率应用于保存用户所做的变换的矩阵的平移部分

    float containerToOutputRatioWidth = outputWidth / containerWidth;
    float containerToOutputRatioHeight = outputHeight / containerHeight;
    
    float[] values = new float[9];
    transformedImageView.getMatrix().getValues(values);
    values[2] = values[2] * containerToOutputRatioWidth;
    values[5] = values[5] * containerToOutputRatioHeight;
    Matrix outputMatrix = new Matrix();
    outputMatrix.setValues(values);
    
    Run Code Online (Sandbox Code Playgroud)
  • 像使用正确的大小(outputWidth、outputHeight)和矩阵(outputMatrix)一样绘制输出位图。

    Bitmap newBitmap = Bitmap.createBitmap(Math.round(outputWidth), Math.round(outputHeight), Bitmap.Config.ARGB_8888);
    Canvas canvas = new Canvas(newBitmap);
    canvas.drawColor(Color.WHITE);
    Paint paint = new Paint();
    paint.setAntiAlias(true);
    canvas.drawBitmap(src, outputMatrix, paint);
    
    Run Code Online (Sandbox Code Playgroud)

演示

警告

您应该小心内存分配,此代码将导致分配一些大量位图,您应该实现某种符合您需求的限制。(同时在后台进行分配和绘图)

您可能需要根据最初放置图像的位置进行一些调整。