【问题标题】:Android: image saved using copyPixelsFromBuffer is distortedAndroid:使用 copyPixelsFromBuffer 保存的图像失真
【发布时间】:2022-02-03 16:35:44
【问题描述】:

我正在尝试在 Android Studio 中制作图像处理程序,但我遇到了关于如何保存位图的问题。

我的问题是关于保存来自 ByteBuffer 的图像。

为了在此处显示,我这样做了:我将图像加载到 ByteBuffer 中并尝试将其保存,重新缩放为 1014x1163 像素。而且我得到的图像是扭曲的、凌乱的。

例如,这是我加载的图像:

这是我保存的图像中的内容:

这是我的代码:

imageSize = (int) (bmWidth*bmHeight*4);
ByteBuffer pixelsArray = ByteBuffer.allocateDirect(imageSize);
ByteBuffer outputArray = ByteBuffer.allocateDirect(imageSize);

workingBitmap.copyPixelsToBuffer(pixelsArray);
workingBitmap.copyPixelsToBuffer(outputArray);

int thiswidth   = workingBitmap.getWidth();
int thisheight  = workingBitmap.getHeight();

Bitmap copiedBitmap = Bitmap.createScaledBitmap(workingBitmap, Width, Height, false);

int thiswidth2   = copiedBitmap.getWidth();
int thisheight2  = copiedBitmap.getHeight();

outputArray.rewind();
copiedBitmap.copyPixelsFromBuffer(outputArray);
SaveJPG(copiedBitmap);

函数 SaveJPG 工作正常,因为如果我调用 SaveJPG(workingBitmap) 它会保存一个普通图像。

这是调试过程中带有变量值的代码:

我想知道问题是否来自输出分辨率不是 4 的倍数。这在我的程序中是强制性的:输出图像分辨率可以是任何值(奇数或偶数)。

我尝试了很多不同的方法(例如复制 workingBitmap 和调整副本大小)。

没有成功。我不知道问题的原因是什么。

有没有人有一些源代码可以保存任何分辨率的图像,存储在 ByteBuffer 中?

提前致谢。

【问题讨论】:

  • 即使SaveJPG 在一张图片上工作得很好,但这并不意味着它在所有图片上都能正常工作。
  • 如果图像存储在字节缓冲区中,那么只需将该缓冲区的内容保存到磁盘。

标签: java android save jpeg bytebuffer


【解决方案1】:

试试这个

try (FileOutputStream out = new FileOutputStream(yourFileName)) {
    yourBitmap.compress(Bitmap.CompressFormat.PNG, 100, out); // bmp is your Bitmap instance
    // PNG is a lossless format, the compression factor (100) is ignored
} catch (IOException e) {
    e.printStackTrace();
}

或者使用这个

MediaStore.Images.Media.insertImage(getContentResolver(), yourbitmap,
    "File name", "description of the image");

【讨论】:

  • 感谢您的回复。我已经尝试保存在 PNG 中:同样的问题。我已经尝试过使用 MediaStore.Images.Media.insertImage 的解决方案,但它不起作用:同样的问题(保存的图像也失真)。
  • 那么问题出在位图上。让我再检查一下你的代码
  • 从什么加载图像? URIURL 或其他什么?
  • 我正在从 2 个不同的来源加载图像:从图库或手机的相机。我对这两个来源都有同样的问题。
  • 如果您从图库加载,它已经保存。为什么又是?
【解决方案2】:

我找到了问题的原因。这只是由于输入图像的宽度和高度存在问题:我使用的是显示输入位图的 View 的宽度和高度,而不是使用位图的宽度和高度。

【讨论】:

    猜你喜欢
    • 2013-04-28
    • 2018-09-23
    • 1970-01-01
    • 1970-01-01
    • 2013-08-10
    • 2023-03-18
    • 1970-01-01
    • 2015-07-13
    • 2017-02-11
    相关资源
    最近更新 更多