Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/188.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如果图像转换为字节数组,则图像大小会增加_Java_Android_Image_Httpurlconnection - Fatal编程技术网

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

Java 如果图像转换为字节数组,则图像大小会增加,java,android,image,httpurlconnection,Java,Android,Image,Httpurlconnection,我需要上传图像jpeg,png,gif和音频mp3,wav,aa3到网络服务器。所以我需要把图像转换成字节数组。我该怎么做 现在我尝试以下格式。但它增加了尺寸。其他应用程序如何做到这一点而不增加尺寸质量?他们上传原始尺寸和图像质量 Bitmap uploadedImage = ((BitmapDrawable) temp.getDrawable()).getBitmap(); ByteArrayOutputStream stream = new ByteArrayOutputStream();

我需要上传图像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();

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


您可以将drawable的原始数据读入字节数组,并将其发送到服务器。你可以检查这个答案,看看如何做到这一点的例子。

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

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
 }

不需要压缩。只需发送流。一旦获得图像uri,请执行以下操作

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

并使用iStream写入httpsurlconnection。

应用程序最初是如何接收映像文件的?你是从磁盘上读取的吗?与其将图像存储在数据库中,不如在其名称上添加时间戳和唯一标识符,然后将其Ftp到服务器上?@Duncan最初我是从安卓系统的intent收到的。如果我得到了图像uri,你能告诉我如何获得流。图像在哪里?本地文件?网页?图片来自本地文件谢谢你宝贵的回复