如何在android上调整Yuv图像的大小

Posted

技术标签:

【中文标题】如何在android上调整Yuv图像的大小【英文标题】:How to resize Yuv image on android 【发布时间】:2014-06-03 21:29:09 【问题描述】:

请告诉我如何在 android 上调整 yuv 图像的大小。

ByteArrayOutputStream baos = new ByteArrayOutputStream();
mCameraView.myuvImage.compressToJpeg(new Rect(0, 0, mCameraView.myuvImage.getWidth(), mCameraView.myuvImage.getHeight()), 100, baos);

compressToJpeg 方法将 yuv 图像转换为 jpeg。但是我写的时候不会按压缩数调整转换后的JPEG大小

mCameraView.myuvImage.compressToJpeg(new Rect(0, 0, mCameraView.myuvImage.getWidth(), mCameraView.myuvImage.getHeight()), 50, baos);

【问题讨论】:

调整大小如何影响 Eclipse 或图像压缩?您不需要 eclipse 或图像压缩来调整大小。 【参考方案1】:

最简单的方法是创建一个缩放位图。首先,将您的位图转换为位图图像:

ByteArrayOutputStream out = new ByteArrayOutputStream();
YuvImage yuvImage = new YuvImage(mCameraView.myuvImage, PictureFormat.NV21, width, height, null);
yuvImage.compressToJpeg(new Rect(0, 0, width, height), 50, out);
byte[] imageBytes = out.toByteArray();
Bitmap image = BitmapFactory.decodeByteArray(imageBytes, 0, imageBytes.length);

然后,您可以使用以下命令调整大小:

Bitmap resized = Bitmap.createScaledBitmap(image, newWidth, newHeight, true);

【讨论】:

我不需要缩放位图,我需要缩放 YuvImage @user2050649,在YUVImage的构造函数中,有宽度和高度的参数,你可以试试吗? new YuvImage(mCamera.myuvImage, pictureformat, newWidth, newHeight,...) @user2050649,试试这个***.com/questions/5960247/… 我试过YuvImages构造函数的宽高参数,这种方式是错误的【参考方案2】:

我发现的可能不是一个很好的方法,但至少对我有用:

YuvImage image = new YuvImage(data, ImageFormat.NV21, size.width, size.height, null); //create YuvImage instance with initial size
ByteArrayOutputStream bao = new ByteArrayOutputStream();
image.compressToJpeg(new Rect(0, 0, image.getWidth(), image.getHeight()), jpegQuality, bao);

我有aspect 设置在外面的值。该值表示乘数,我们将比例减小多少,例如如果aspect == 1,我们使用相同的分辨率。如果 aspect == 2 我们将图像分辨率除以 2 等等。仅在 aspect != 1 的情况下才需要缩放

if (aspect != 1) 
    int newWidth = image.getWidth() / aspect;
    int newHeight = image.getHeight() / aspect;
    byte[] scaledBitmapData = bitmapToByteArray(createScaledBitmap(bao.toByteArray(), newWidth, newHeight));
    bao = new ByteArrayOutputStream(scaledBitmapData.length);
    bao.write(scaledBitmapData, 0 , scaledBitmapData.length);

    image.compressToJpeg(new Rect(0, 0, newWidth, newHeight), jpegQuality, bao);

实用方法:

public static Bitmap createScaledBitmap(byte[] bitmapAsData, int width, int height) 
    Bitmap bitmap = BitmapFactory.decodeByteArray(bitmapAsData, 0, bitmapAsData.length);
    return createScaledBitmap(bitmap, width, height);


public static Bitmap createScaledBitmap(Bitmap bitmap, int width, int height) 
    return Bitmap.createScaledBitmap(bitmap, width, height, true);


public static byte[] bitmapToByteArray(Bitmap bitmap) 
    ByteArrayOutputStream blob = new ByteArrayOutputStream();
    bitmap.compress(Bitmap.CompressFormat.JPEG, JPEG_QUALITY, blob);
    return blob.toByteArray();

这应该可以解决问题。

【讨论】:

以上是关于如何在android上调整Yuv图像的大小的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Android 中调整图像大小?

如何在不缩小图像的情况下在 Android 中调整图像大小?

如何在 iOS 设备上调整图像大小?

如何使用 XML 根据图像大小调整 Android 组件的大小

iPhone iOS:如何在图像背景上动态移动/调整图像大小?

如何在不使用css调整第一个图像大小的情况下在Wordpress页面上调整第二个图像的大小?