마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

bitmap -> jpg 로 변환시 용량 증가 질문있습니다.

0 추천

지금.... 어떠한 방식이냐면

 

갤러리에서 사진을 선택하면

 

uri 를 가지고 옵니다.

filename = /storage/emulated/0/DCIM/Camera/20170118_185503.jpg

이런식으로 리스트를 받아오고요

 

File sourcefile = new File(filename); 

이렇게 파일 생성 후에

 

Bitmap = bitmap = BitmapFactory.decodeFile(filename);

비트맵을 생성해 줍니다.

비트맵 회전 처리 후에

 

function(){

 File storage = context.getCacheDir(); // 이 부분이 임시파일 저장 경로

 String fileName = "abcd.jpg";  // 파일이름은 마음대로!

 File tempFile = new File(storage, fileName);

try {
     tempFile.createNewFile();  // 파일을 생성해주고

     FileOutputStream out = new FileOutputStream(tempFile);

    bitmap.compress(Bitmap.CompressFormat.JPEG, 100, out);  

    out.close(); 

} catch (FileNotFoundException e) {
            e.printStackTrace();
} catch (IOException e) {
            e.printStackTrace();
}

return tempFile.getAbsolutePath();

}

 

bitmap -> jpeg 로 변경 후에 경로 리턴 받아서

 

sourcefile = new File(filename); 해서 기존 파일객체에 덮어씌워주고요

 

FileInputStream fileInputStream = new FileInputStream(sourceFile);
URL url = new URL(upLoadServerUri);

// Open a HTTP  connection to  the URL
conn = (HttpURLConnection) url.openConnection();
conn.setDoInput(true); // Allow Inputs
conn.setDoOutput(true); // Allow Outputs
conn.setUseCaches(false); // Don't use a Cached Copy
conn.setRequestMethod("POST");
conn.setRequestProperty("Connection", "Keep-Alive");
conn.setRequestProperty("ENCTYPE", "multipart/form-data");
conn.setRequestProperty("Content-Type", "multipart/form-data;boundary=" + boundary);
conn.setRequestProperty("uploaded_file", fileName1);

dos = new DataOutputStream(conn.getOutputStream());

dos.writeBytes(twoHyphens + boundary + lineEnd);
imageName = id + "_" + String.valueOf(System.currentTimeMillis()) + isWidth + "_" + count +".jpg&" + sourceFile.length();
dos.writeBytes("Content-Disposition: form-data; name=\"uploaded_file\";filename=\""
        + imageName + "\"" + lineEnd); //이 부분에서 이름을 정해줍니다.
pathListChangeName.add(imageName);
dos.writeBytes(lineEnd);

// create a buffer of  maximum size
bytesAvailable = fileInputStream.available();

bufferSize = Math.min(bytesAvailable, maxBufferSize);
buffer = new byte[bufferSize];

// read file and write it into form...
bytesRead = fileInputStream.read(buffer, 0, bufferSize);

while (bytesRead > 0) {

    dos.write(buffer, 0, bufferSize);
    bytesAvailable = fileInputStream.available();
    bufferSize = Math.min(bytesAvailable, maxBufferSize);
    bytesRead = fileInputStream.read(buffer, 0, bufferSize);

}

// send multipart form data necesssary after file data...
dos.writeBytes(lineEnd);
dos.writeBytes(twoHyphens + boundary + twoHyphens + lineEnd);

// Responses from the server (code and message)
serverResponseCode = conn.getResponseCode();
String serverResponseMessage = conn.getResponseMessage();

Log.i("uploadFile", "HTTP Response is : "
        + serverResponseMessage + ": " + serverResponseCode);

//Log.i(TAG, response)


//close the streams //
fileInputStream.close();
dos.flush();
dos.close();

 

fileinputstream 으로 서버에 전송합니다.

 

이때

기존용량이 177kb -> 429kb로 증가하는 현상이 발견됩니다.

중간에 1메가 이하로 줄이는 함수가 있는데

1메가 이상이면 상관이 없다만(증가해도 줄어들기때문에)

이하이면 이렇게 증가하는 현상이 발생합니다.

 

정상적인 현상인지요...

파일은 갤러리에서 확인해도 177kb, 컴퓨터로 확인해도 177kb이구요

 

저 함수를 거쳐 업로드 하게되면 용량이 증가합니다.

무엇이 문제일지 조언좀 부탁드립니다.

status (1,410 포인트) 님이 2017년 1월 18일 질문

1개의 답변

0 추천
 
채택된 답변

코드중에 압축률을 설정하는 부분이 있습니다. 

    bitmap.compress(Bitmap.CompressFormat.JPEG, 100, out);  

기존에 이미지가 100 이 아니였고 저장하려는 이미지가 100 이면 증가하는게 맞습니다. 

aucd29 (218,390 포인트) 님이 2017년 1월 19일 답변
status님이 2017년 1월 23일 채택됨
90으로 하면 품질이 좀 떨어지는것 같더라구요.. 그럼 원래 파일의 품질은 잘 모르니까 대략 90~100 사이에 값으로 임의로 잡아야 하는것일까요? 혹은 원래 파일의 품질을 알 수 있는 방법이 있겠습니까? 어제 임시로 98로 맞추어 놓긴 했는데 조금은 증가하더라구요
jpeg 는 손실 압축 이기 때문에 재 저장 하면 품질이 떨어질 수 밖에 없습니다.
그렇기 때문에 인터넷에 돌아다니는 짤이 시간이 가면 엉망이 되는것이구요
벗어나려면 png 같은것으로 저장해야 하지만 png 는 zip 압축이므로 압축률이 떨어지기 때문에 압축률 100 준 jpeg 보다 사이즈가 커질 가능성이 있습니다.
아나 계속 증가되는것때문에 고민이많았는데... 명쾌한 답변 감사합니다!! ㅎㅎㅎ
...