package com.bumptech.glide.load.resource.bitmap;
import android.graphics.Bitmap;
import android.util.Log;
import com.bumptech.glide.load.EncodeStrategy;
import com.bumptech.glide.load.Option;
import com.bumptech.glide.load.Options;
import com.bumptech.glide.load.ResourceEncoder;
import com.bumptech.glide.load.engine.Resource;
import com.bumptech.glide.util.LogTime;
import com.bumptech.glide.util.Util;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
/**
* An {@link com.bumptech.glide.load.ResourceEncoder} that writes {@link android.graphics.Bitmap}s
* to {@link java.io.OutputStream}s.
*
* <p> {@link android.graphics.Bitmap}s that return true from
* {@link android.graphics.Bitmap#hasAlpha ()}} are written using
* {@link android.graphics.Bitmap.CompressFormat#PNG}
* to preserve alpha and all other bitmaps are written using
* {@link android.graphics.Bitmap.CompressFormat#JPEG}. </p>
*
* @see android.graphics.Bitmap#compress(android.graphics.Bitmap.CompressFormat, int,
* java.io.OutputStream)
*/
public class BitmapEncoder implements ResourceEncoder<Bitmap> {
/**
* An integer option between 0 and 100 that is used as the compression quality.
*
* <p> Defaults to 90. </p>
*/
public static final Option<Integer> COMPRESSION_QUALITY = Option.memory(
"com.bumptech.glide.load.resource.bitmap.BitmapEncoder.CompressionQuality", 90);
/**
* An {@link android.graphics.Bitmap.CompressFormat} option used as the format to encode
* the {@link android.graphics.Bitmap}.
*
* <p> Defaults to {@link android.graphics.Bitmap.CompressFormat#JPEG} for images without alpha
* and {@link android.graphics.Bitmap.CompressFormat#PNG} for images with alpha. </p>
*/
public static final Option<Bitmap.CompressFormat> COMPRESSION_FORMAT = Option.memory(
"com.bumptech.glide.load.resource.bitmap.BitmapEncoder.CompressionFormat");
private static final String TAG = "BitmapEncoder";
@Override
public boolean encode(Resource<Bitmap> resource, File file, Options options) {
final Bitmap bitmap = resource.get();
long start = LogTime.getLogTime();
Bitmap.CompressFormat format = getFormat(bitmap, options);
int quality = options.get(COMPRESSION_QUALITY);
boolean success = false;
OutputStream os = null;
try {
os = new FileOutputStream(file);
bitmap.compress(format, quality, os);
os.close();
success = true;
} catch (IOException e) {
if (Log.isLoggable(TAG, Log.DEBUG)) {
Log.d(TAG, "Failed to encode Bitmap", e);
}
} finally {
if (os != null) {
try {
os.close();
} catch (IOException e) {
// Do nothing.
}
}
}
if (Log.isLoggable(TAG, Log.VERBOSE)) {
Log.v(TAG, "Compressed with type: " + format + " of size " + Util.getBitmapByteSize(bitmap)
+ " in " + LogTime.getElapsedMillis(start));
}
return success;
}
private Bitmap.CompressFormat getFormat(Bitmap bitmap, Options options) {
Bitmap.CompressFormat format = options.get(COMPRESSION_FORMAT);
if (format != null) {
return format;
} else if (bitmap.hasAlpha()) {
return Bitmap.CompressFormat.PNG;
} else {
return Bitmap.CompressFormat.JPEG;
}
}
@Override
public EncodeStrategy getEncodeStrategy(Options options) {
return EncodeStrategy.TRANSFORMED;
}
}