1

我有一个 java 应用程序允许用户从他的相机拍摄照片并使用网络服务将其发送给我,但我的问题是在发送图像时。发送进度需要很长时间,因为图像很大,所以我想压缩图像。我试图:

1-使用此代码:

Bitmap img = BitmapFactory.decodeFile("C:\\test.jpg");

ByteArrayOutputStream streem = new ByteArrayOutputStream();  
img.compress(Bitmap.CompressFormat.JPEG, 75, streem);
byte[] b = streem.toByteArray();

但是这段代码在我的情况下是无用的,因为它使图像非常糟糕并且对图像大小的影响很大。

2- 搜索很多关于调整大小的方法,但所有结果都使用 BufferedImage。我不能使用这种类型(类),因为它需要大量内存:

private static BufferedImage resizeImage(BufferedImage originalImage, int type)
{
    BufferedImage resizedImage = new BufferedImage(new_w, new_h, type);
    Graphics2D g = resizedImage.createGraphics();
    g.drawImage(originalImage, 0, 0, new_w, new_h, null);
    g.dispose();

    return resizedImage;
}

我想改用位图,任何人都可以在我的应用程序中帮助我???

4

2 回答 2

1

用于ImageIO写入BufferedImage您需要的格式

您可以提供一个输出流,ImageIO因此您应该能够写入几乎任何地方。

查看写入/保存图像了解更多详情

于 2012-11-24T20:54:39.447 回答
1

我找到了这些方法:

private static int CalculateInSampleSize(BitmapFactory.Options options,
        int reqWidth, int reqHeight) {
    float height = (float) options.outHeight;
    float width = (float) options.outWidth;
    float inSampleSize = 0;

    if (height > reqHeight || width > reqWidth) {
        inSampleSize = width > height ? height / reqHeight : width
                / reqWidth;
    }

    return (int) Math.round(inSampleSize);
}

public static byte[] ResizeImage(int reqWidth, int reqHeight, byte[] buffer) {
    BitmapFactory.Options op = new Options();
    op.inJustDecodeBounds = true;

    BitmapFactory.decodeByteArray(buffer, 0, buffer.length, op);

    op.inSampleSize = CalculateInSampleSize(op, reqWidth, reqHeight);

    op.inJustDecodeBounds = false;
    try {
        return ToByte(BitmapFactory.decodeByteArray(buffer, 0,
                buffer.length, op));
    } catch (Exception e) {
        e.printStackTrace();
        return null;
    }

}
于 2012-11-28T12:23:30.490 回答