如果图像转换为字节数组,图像大小会增加

时间:2013-12-06 09:57:25

标签: java android image httpurlconnection

我需要将图片(jpeg,png,gif)和音频(mp3,wav,aa3)上传到网络服务器。所以我需要将图像转换为字节数组。我怎么做?

现在我尝试以下格式。但它增加了尺寸。其他应用程序如何在不增加尺寸质量的情况下执他们上传原始尺寸和图像质量。

Bitmap uploadedImage = ((BitmapDrawable) temp.getDrawable()).getBitmap();
ByteArrayOutputStream stream = new ByteArrayOutputStream();
uploadedImage.compress(Bitmap.CompressFormat.JPEG, 100, stream);
byte[] bytes = stream.toByteArray();

3 个答案:

答案 0 :(得分:0)

原始图像在转换为位图时会增加大小,因为您提到的所有图像格式都使用某种形式的压缩(有些是无损的,有些则没有)。使用位图时,不会使用压缩。

您可以将drawable的原始数据读入字节数组并将其发送到服务器。您可以查看答案Reading a resource sound file into a Byte array以查看如何完成此操作的示例。

答案 1 :(得分:0)

大概你已经有了某种形式的形象?不要尝试解压缩或处理它,只需将其作为字节流发送到服务器。例如,如果它已经是您计算机上的文件:

public String postFile(URL url, InputStream in) throws IOException {
    try {

        HttpURLConnection connection = (HttpURLConnection) url.openConnection(); 
        try {
            connection.setRequestMethod("POST");
            connection.setChunkedStreamingMode(CHUNK_SIZE);
            connection.setDoOutput(true);
            connection.setRequestProperty("Content-Type","application/octet-stream");

            try (OutputStream out = connection.getOutputStream()) {
                byte[] buffer = new byte[CHUNK_SIZE]; 
                int len;
                while ((len = in.read(buffer)) != -1) {
                    out.write(buffer, 0, len);
                }
            }

            if (connection.getResponseCode() != 201) {
                try (BufferedReader br = new BufferedReader(new InputStreamReader(connection.getErrorStream()))) {
                    // TODO: Handle error
                }
            } else {
                try (BufferedReader br = new BufferedReader(new InputStreamReader(connection.getInputStream()))) {
                    // TODO: Handle success
                }
            }
        } finally {
            connection.disconnect();
        }
}

要发送文件只需传入FileInputStream,发送字节就可以简化上面的功能,这样就不需要从流中读取数据,只需在输出流上发送字节缓冲区即可。

要获取您需要的本地文件的InputStream:

 File file = ....
 try (InputStream is = new FileInputStream(file)) {
    postFile(url, is);
 } catch (FileNotFoundException ex) {
      // TODO: Handle error
 }

答案 2 :(得分:0)

无需压缩。只需发送为流。一旦得到图像uri做以下..

InputStream iStream = context.getContentResolver().openInputStream(uri);

并使用iStream编写httpsurlconnection。