Java 如果图像转换为字节数组,则图像大小会增加
我需要上传图像jpeg,png,gif和音频mp3,wav,aa3到网络服务器。所以我需要把图像转换成字节数组。我该怎么做 现在我尝试以下格式。但它增加了尺寸。其他应用程序如何做到这一点而不增加尺寸质量?他们上传原始尺寸和图像质量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();
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,你能告诉我如何获得流。图像在哪里?本地文件?网页?图片来自本地文件谢谢你宝贵的回复