Merge "Add Bitmap.CompressFormat#WEBP_LOSSY/LOSSLESS"

This commit is contained in:
TreeHugger Robot
2019-10-17 14:26:46 +00:00
committed by Android (Google) Code Review
3 changed files with 71 additions and 24 deletions

View File

@@ -13773,7 +13773,9 @@ package android.graphics {
public enum Bitmap.CompressFormat {
enum_constant public static final android.graphics.Bitmap.CompressFormat JPEG;
enum_constant public static final android.graphics.Bitmap.CompressFormat PNG;
enum_constant public static final android.graphics.Bitmap.CompressFormat WEBP;
enum_constant @Deprecated public static final android.graphics.Bitmap.CompressFormat WEBP;
enum_constant public static final android.graphics.Bitmap.CompressFormat WEBP_LOSSLESS;
enum_constant public static final android.graphics.Bitmap.CompressFormat WEBP_LOSSY;
}
public enum Bitmap.Config {

View File

@@ -9,6 +9,7 @@
#include "SkColorSpace.h"
#include "GraphicsJNI.h"
#include "SkStream.h"
#include "SkWebpEncoder.h"
#include "android_os_Parcel.h"
#include "android_util_Binder.h"
@@ -526,27 +527,14 @@ static void Bitmap_reconfigure(JNIEnv* env, jobject clazz, jlong bitmapHandle,
enum JavaEncodeFormat {
kJPEG_JavaEncodeFormat = 0,
kPNG_JavaEncodeFormat = 1,
kWEBP_JavaEncodeFormat = 2
kWEBP_JavaEncodeFormat = 2,
kWEBP_LOSSY_JavaEncodeFormat = 3,
kWEBP_LOSSLESS_JavaEncodeFormat = 4,
};
static jboolean Bitmap_compress(JNIEnv* env, jobject clazz, jlong bitmapHandle,
jint format, jint quality,
jobject jstream, jbyteArray jstorage) {
SkEncodedImageFormat fm;
switch (format) {
case kJPEG_JavaEncodeFormat:
fm = SkEncodedImageFormat::kJPEG;
break;
case kPNG_JavaEncodeFormat:
fm = SkEncodedImageFormat::kPNG;
break;
case kWEBP_JavaEncodeFormat:
fm = SkEncodedImageFormat::kWEBP;
break;
default:
return JNI_FALSE;
}
LocalScopedBitmap bitmap(bitmapHandle);
if (!bitmap.valid()) {
return JNI_FALSE;
@@ -577,6 +565,30 @@ static jboolean Bitmap_compress(JNIEnv* env, jobject clazz, jlong bitmapHandle,
}
skbitmap = p3;
}
SkEncodedImageFormat fm;
switch (format) {
case kJPEG_JavaEncodeFormat:
fm = SkEncodedImageFormat::kJPEG;
break;
case kPNG_JavaEncodeFormat:
fm = SkEncodedImageFormat::kPNG;
break;
case kWEBP_JavaEncodeFormat:
fm = SkEncodedImageFormat::kWEBP;
break;
case kWEBP_LOSSY_JavaEncodeFormat:
case kWEBP_LOSSLESS_JavaEncodeFormat: {
SkWebpEncoder::Options options;
options.fQuality = quality;
options.fCompression = format == kWEBP_LOSSY_JavaEncodeFormat ?
SkWebpEncoder::Compression::kLossy : SkWebpEncoder::Compression::kLossless;
return SkWebpEncoder::Encode(strm.get(), skbitmap.pixmap(), options) ?
JNI_TRUE : JNI_FALSE;
}
default:
return JNI_FALSE;
}
return SkEncodeImage(strm.get(), skbitmap, fm, quality) ? JNI_TRUE : JNI_FALSE;
}

View File

@@ -1359,9 +1359,44 @@ public final class Bitmap implements Parcelable {
* Specifies the known formats a bitmap can be compressed into
*/
public enum CompressFormat {
JPEG (0),
PNG (1),
WEBP (2);
/**
* Compress to the JPEG format. {@code quality} of {@code 0} means
* compress for the smallest size. {@code 100} means compress for max
* visual quality.
*/
JPEG (0),
/**
* Compress to the PNG format. PNG is lossless, so {@code quality} is
* ignored.
*/
PNG (1),
/**
* Compress to the WEBP format. {@code quality} of {@code 0} means
* compress for the smallest size. {@code 100} means compress for max
* visual quality. As of {@link android.os.Build.VERSION_CODES#Q}, a
* value of {@code 100} results in a file in the lossless WEBP format.
* Otherwise the file will be in the lossy WEBP format.
*
* @deprecated in favor of the more explicit
* {@link CompressFormat#WEBP_LOSSY} and
* {@link CompressFormat#WEBP_LOSSLESS}.
*/
@Deprecated
WEBP (2),
/**
* Compress to the WEBP lossy format. {@code quality} of {@code 0} means
* compress for the smallest size. {@code 100} means compress for max
* visual quality.
*/
WEBP_LOSSY (3),
/**
* Compress to the WEBP lossless format. {@code quality} refers to how
* much effort to put into compression. A value of {@code 0} means to
* compress quickly, resulting in a relatively large file size.
* {@code 100} means to spend more time compressing, resulting in a
* smaller file.
*/
WEBP_LOSSLESS (4);
CompressFormat(int nativeInt) {
this.nativeInt = nativeInt;
@@ -1385,10 +1420,8 @@ public final class Bitmap implements Parcelable {
* pixels).
*
* @param format The format of the compressed image
* @param quality Hint to the compressor, 0-100. 0 meaning compress for
* small size, 100 meaning compress for max quality. Some
* formats, like PNG which is lossless, will ignore the
* quality setting
* @param quality Hint to the compressor, 0-100. The value is interpreted
* differently depending on the {@link CompressFormat}.
* @param stream The outputstream to write the compressed data.
* @return true if successfully compressed to the specified stream.
*/