2017-09-28 14 views
1

이미지 파일 (jpg)이 있는데 회전해야합니다. 그러나 디스크에 다시 저장할 때 다시 압축하지 않으려합니다. 이 일을 할 수있는 방법이 있습니까?이미지를 다시 압축하지 않고 이미지를 회전하고 저장하는 방법은 무엇입니까?

나는 이런 식으로 이미지를 저장 :

matrix.setRotate(-90); 
    Bitmap bitmap = BitmapFactory.decodeFile(imagePath, options); 
    Bitmap bmRotated = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true); 
    bitmap.recycle(); 

    FileOutputStream fileoutputstream = new FileOutputStream(imagePath); 
    bmRotated.compress(CompressFormat.JPEG, 100, fileoutputstream); 
    fileoutputstream.flush(); 
    fileoutputstream.close(); 
    bmRotated.recycle(); 
+0

https://en.wikipedia.org/wiki/WebP

당신이 몇 가지 코드를 넣어 저장하는 방법 그래서 우리는 당신을 도울 수있는 일 – UltimateDevil

+0

을 시도 했 더 나은 – UltimateDevil

+0

@VikasTiwari : 일, 난 – noa

답변

0

은 어쩌면 당신은 바이트 배열로 비트 맵에서 데이터를 추출하고 해당 배열을 저장하려고 할 수 있습니다. (코드가 테스트되지 않았거나 작동하지 않을 수 있습니다.)

Bitmap bitmap = new Bitmap()... 
int width = bitmap.getWidth(); 
int height = bitmap.getHeight(); 

int size = bitmap.getRowBytes() * bitmap.getHeight(); 
ByteBuffer byteBuffer = ByteBuffer.allocate(size); 
bitmap.copyPixelsToBuffer(byteBuffer); 
byte[] byteArray = byteBuffer.array(); 

FileOutputStream output = new FileOutputStream("filename"); 
output.write(byteArray); 
output.close(); 
0

JPG 대신 PNG를 사용하십시오. PNG 형식은 압축 할 수있는 손실없는 데이터 형식입니다.

matrix.setRotate(-90); 
Bitmap bitmap = BitmapFactory.decodeFile(imagePath, options); 
Bitmap bmRotated = Bitmap.createBitmap(bitmap, 0, 0, 
bitmap.getWidth(), bitmap.getHeight(), matrix, true); 
bitmap.recycle(); 

FileOutputStream fileoutputstream = new FileOutputStream(imagePath); 
bmRotated.compress(CompressFormat.PNG, 100, fileoutputstream); 
fileoutputstream.flush(); 
fileoutputstream.close(); 
bmRotated.recycle(); 


https://en.wikipedia.org/wiki/Portable_Network_Graphics

또는, WebP 형식 형식을 사용, 압축기 라이브러리를 사용할 수 있습니다.
WEBP는 무손실 및 손실을 모두 지원합니다. https://github.com/zetbaitsu/Compressor

compressedImage = new Compressor(this) 
     .setMaxWidth(640) 
     .setMaxHeight(480) 
     .setQuality(100) 
     .setCompressFormat(Bitmap.CompressFormat.WEBP) 
     .setDestinationDirectoryPath(Environment.getExternalStoragePublicDirectory(
      Environment.DIRECTORY_PICTURES).getAbsolutePath()) 
     .compressToFile(actualImage); 
+0

아니요, png가 원본 파일의 크기를 3 씩 증가시킬 것입니다. + 7 초 정도 걸립니다. 파일을 저장하십시오 : ( WebP는 좋은 대안이고 품질은 80이고 왜 90이 아니며 95? – noa

+0

WEBP의 @noa 품질은 100입니다. github 사이트에서 예제를 복사하여 붙여 넣기 만하면됩니다. –

+0

@noa 또한 WEBP를 사용하려면 API 14 이상이 필요합니다. https://stackoverflow.com/questions/19308831/android-java-lang-nosuchfielderror-android-graphics-bitmapcompressformat-web –