gpt4 book ai didi

android - 图像压缩,如 Whatsapp 和 Android 上的其他信使

转载 作者:IT老高 更新时间:2023-10-28 23:31:14 27 4
gpt4 key购买 nike

我正在使用以下代码进行图像压缩。

代码压缩大于 2 MB 的图像文件。

但此代码需要时间,而且图像质量保持纯净。

public static String compressImage(String imagePath, Context context)
{
String resizeImagePath = null;
String filePath = imagePath;
CustomLogHandler.printDebug(TAG, "resizeImagePath:" + imagePath);
Bitmap scaledBitmap = null;
int imageScal = 1;

// File size greater then 2mb
DecimalFormat df = new DecimalFormat("0.00");
File imgFile = new File(filePath);
double bytes = imgFile.length();
double kilobytes = (bytes / 1024);
double megabytes = (kilobytes / 1024);

AppConfig.makeLog(TAG, "image size in mb:" + df.format(megabytes), 0);

double filesize = Double.parseDouble(df.format(megabytes));
if (filesize > 2.00f)
{

for (int i = 0; i < filesize; i = i + 2)
{

imageScal++;
}
int remind = imageScal / 2;
if (remind != 0)
{
imageScal = imageScal + 1;
}

makeLog(TAG, "image scale:" + imageScal, 0);

BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
Bitmap bmp = BitmapFactory.decodeFile(filePath, options);

int actualHeight = options.outHeight;
int actualWidth = options.outWidth;
float maxHeight = 4000;
float maxWidth = 6000;
// float imgRatio = actualWidth / actualHeight;
// float maxRatio = maxWidth / maxHeight;

if (actualHeight > maxHeight)
{
imageScal = imageScal + 4;
}

if (actualWidth > maxWidth)
{
imageScal = imageScal + 8;
}

// if (actualHeight > maxHeight || actualWidth > maxWidth)
// {
// if (imgRatio < maxRatio)
// {
// imgRatio = maxHeight / actualHeight;
// actualWidth = (int) (imgRatio * actualWidth);
// actualHeight = (int) maxHeight;
//
// }
// else if (imgRatio > maxRatio)
// {
// imgRatio = maxWidth / actualWidth;
// actualHeight = (int) (imgRatio * actualHeight);
// actualWidth = (int) maxWidth;
// }
// else
// {
// actualHeight = (int) maxHeight;
// actualWidth = (int) maxWidth;
//
// }
// }

// options.inSampleSize = utils.calculateInSampleSize(options, actualWidth, actualHeight);
options.inSampleSize = imageScal;
options.inJustDecodeBounds = false;
options.inDither = true;
options.inPurgeable = true;
options.inInputShareable = true;
options.inTempStorage = new byte[16 * 1024];

try
{
bmp = BitmapFactory.decodeFile(filePath, options);
bmp = decodeFile(filePath);
}
catch (OutOfMemoryError exception)
{
exception.printStackTrace();

}
boolean done = false;

while (!done)
{
try
{
scaledBitmap = Bitmap.createBitmap(actualWidth, actualHeight, Bitmap.Config.ARGB_8888);

// scaledBitmap = Bitmap.createBitmap(actualWidth, actualHeight, Bitmap.Config.ARGB_8888);

done = true;
}
catch (OutOfMemoryError exception)
{
// 15923 × 1790
// 5616 × 3744
// 8150 × 9154
actualWidth = actualWidth - ((actualWidth * 2) / 100);
actualHeight = actualHeight - ((actualHeight * 2) / 100);
// scaledBitmap = Bitmap.createBitmap(5616, 3744, Bitmap.Config.ARGB_8888);
exception.printStackTrace();
}

}

float ratioX = actualWidth / (float) options.outWidth;
float ratioY = actualHeight / (float) options.outHeight;
float middleX = actualWidth / 2.0f;
float middleY = actualHeight / 2.0f;

Matrix scaleMatrix = new Matrix();
scaleMatrix.setScale(ratioX, ratioY, middleX, middleY);

Canvas canvas = new Canvas(scaledBitmap);
canvas.setMatrix(scaleMatrix);
canvas.drawBitmap(bmp, middleX - bmp.getWidth() / 2, middleY - bmp.getHeight() / 2, new Paint(Paint.FILTER_BITMAP_FLAG));

// Resize image stored in sdcard
FileOutputStream out = null;
// filename =AppConfig.fileTosaveMedia(context, FileType.IMAGE, true).getAbsolutePath();
int compress = 50;
try
{
do
{
imgFile = AppConfig.fileTosaveMedia(context, FileType.IMAGE, true);
out = new FileOutputStream(imgFile);
scaledBitmap.compress(Bitmap.CompressFormat.JPEG, compress, out);

resizeImagePath = imgFile.getAbsolutePath();

// Thread.sleep(15000);
// imgFile = new File(filename);
bytes = imgFile.length();
kilobytes = (bytes / 1024);
megabytes = (kilobytes / 1024);
System.out.println("resized image size in mb:" + df.format(megabytes));

filesize = Double.parseDouble(df.format(megabytes));
if (filesize > 2.00f)
{
compress = 30;
}
} while (filesize > 2.00f);
scaledBitmap.recycle();
}
catch (Exception e)
{
e.printStackTrace();
}
}
else
{

FileOutputStream out = null;
// FileInputStream in = null;
imgFile = AppConfig.fileTosaveMedia(context, FileType.IMAGE, true);
resizeImagePath = imgFile.getAbsolutePath();
InputStream in = null;
OutputStream outTemp = null;
try
{

// create output directory if it doesn't exist

in = new FileInputStream(filePath);
outTemp = new FileOutputStream(resizeImagePath);

byte[] buffer = new byte[1024];
int read;
while ((read = in.read(buffer)) != -1)
{
outTemp.write(buffer, 0, read);
}
in.close();
in = null;

// write the output file (You have now copied the file)
outTemp.flush();
outTemp.close();
outTemp = null;

}
catch (FileNotFoundException fnfe1)
{
Log.e("tag", fnfe1.getMessage());
}
catch (Exception e)
{
Log.e("tag", e.getMessage());
}

// try
// {
// Bitmap bmp = decodeFile(filePath);
// // in = new FileInputStream(new File(imagePath));
// // persistImage(bitmap, name);
// out = new FileOutputStream(resizeImagePath);
// bmp.compress(Bitmap.CompressFormat.JPEG, 100, out);
// out.flush();
// out.close();
// // FileIO.copyStream(in, out);
// }
// catch (Exception e)
// {
// e.printStackTrace();
// }
}
CustomLogHandler.printDebug(TAG, "resizeImagePath:" + resizeImagePath);
return resizeImagePath;
}

我花了很多时间在 Google 搜索和阅读博客上。然后在创建上面的代码后,我发现this .

上面的代码正确吗?或者有没有其他库可以用来压缩图片?

请帮帮我。

最佳答案

试试下面的代码:-

public String compressImage(String imageUri) {

String filePath = getRealPathFromURI(imageUri);
Bitmap scaledBitmap = null;

BitmapFactory.Options options = new BitmapFactory.Options();

// by setting this field as true, the actual bitmap pixels are not loaded in the memory. Just the bounds are loaded. If
// you try the use the bitmap here, you will get null.
options.inJustDecodeBounds = true;
Bitmap bmp = BitmapFactory.decodeFile(filePath, options);

int actualHeight = options.outHeight;
int actualWidth = options.outWidth;

// max Height and width values of the compressed image is taken as 816x612

float maxHeight = 816.0f;
float maxWidth = 612.0f;
float imgRatio = actualWidth / actualHeight;
float maxRatio = maxWidth / maxHeight;

// width and height values are set maintaining the aspect ratio of the image

if (actualHeight > maxHeight || actualWidth > maxWidth) {
if (imgRatio < maxRatio) { imgRatio = maxHeight / actualHeight; actualWidth = (int) (imgRatio * actualWidth); actualHeight = (int) maxHeight; } else if (imgRatio > maxRatio) {
imgRatio = maxWidth / actualWidth;
actualHeight = (int) (imgRatio * actualHeight);
actualWidth = (int) maxWidth;
} else {
actualHeight = (int) maxHeight;
actualWidth = (int) maxWidth;

}
}

// setting inSampleSize value allows to load a scaled down version of the original image

options.inSampleSize = calculateInSampleSize(options, actualWidth, actualHeight);

// inJustDecodeBounds set to false to load the actual bitmap
options.inJustDecodeBounds = false;

// this options allow android to claim the bitmap memory if it runs low on memory
options.inPurgeable = true;
options.inInputShareable = true;
options.inTempStorage = new byte[16 * 1024];

try {
// load the bitmap from its path
bmp = BitmapFactory.decodeFile(filePath, options);
} catch (OutOfMemoryError exception) {
exception.printStackTrace();

}
try {
scaledBitmap = Bitmap.createBitmap(actualWidth, actualHeight,Bitmap.Config.ARGB_8888);
} catch (OutOfMemoryError exception) {
exception.printStackTrace();
}

float ratioX = actualWidth / (float) options.outWidth;
float ratioY = actualHeight / (float) options.outHeight;
float middleX = actualWidth / 2.0f;
float middleY = actualHeight / 2.0f;

Matrix scaleMatrix = new Matrix();
scaleMatrix.setScale(ratioX, ratioY, middleX, middleY);

Canvas canvas = new Canvas(scaledBitmap);
canvas.setMatrix(scaleMatrix);
canvas.drawBitmap(bmp, middleX - bmp.getWidth() / 2, middleY - bmp.getHeight() / 2, new Paint(Paint.FILTER_BITMAP_FLAG));

// check the rotation of the image and display it properly
ExifInterface exif;
try {
exif = new ExifInterface(filePath);

int orientation = exif.getAttributeInt(
ExifInterface.TAG_ORIENTATION, 0);
Log.d("EXIF", "Exif: " + orientation);
Matrix matrix = new Matrix();
if (orientation == 6) {
matrix.postRotate(90);
Log.d("EXIF", "Exif: " + orientation);
} else if (orientation == 3) {
matrix.postRotate(180);
Log.d("EXIF", "Exif: " + orientation);
} else if (orientation == 8) {
matrix.postRotate(270);
Log.d("EXIF", "Exif: " + orientation);
}
scaledBitmap = Bitmap.createBitmap(scaledBitmap, 0, 0,
scaledBitmap.getWidth(), scaledBitmap.getHeight(), matrix,
true);
} catch (IOException e) {
e.printStackTrace();
}

FileOutputStream out = null;
String filename = getFilename();
try {
out = new FileOutputStream(filename);

// write the compressed bitmap at the destination specified by filename.
scaledBitmap.compress(Bitmap.CompressFormat.JPEG, 80, out);

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

return filename;

}

有关信息,请参阅以下链接:-

http://voidcanvas.com/whatsapp-like-image-compression-in-android/

关于android - 图像压缩,如 Whatsapp 和 Android 上的其他信使,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26928597/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com