我目前正在开发一款Android应用程序,我必须使用php将我的Image发送到MySql服务器
我正在使用BLOB类型字段,它限制我保存大图像。它只允许64KiB,但不会少,但会导致大图像出现问题。
我不想要任何好的质量,但只是想保存它。我使用Bitmap.compress方法压缩它。我盲目地使用它,不知道它是否运作良好。
这是我的转换方法:
public Bitmap compress(Bitmap bitmap){
Bitmap original =bitmap;
ByteArrayOutputStream out = new ByteArrayOutputStream();
original.compress(Bitmap.CompressFormat.JPEG, 30, out);
Bitmap decoded = BitmapFactory.decodeStream(new ByteArrayInputStream(out.toByteArray()));
Log.e("Original dimensions", original.getWidth() + " " + original.getHeight());
Log.e("Compressed dimensions", decoded.getWidth() + " " + decoded.getHeight());
return decoded;
}
先谢谢
答案 0 :(得分:2)
试试这个:
/**
* reduces the size of the image
* @param image
* @param maxSize
* @return
*/
public Bitmap getResizedBitmap(Bitmap image, int maxSize) {
int width = image.getWidth();
int height = image.getHeight();
float bitmapRatio = (float)width / (float) height;
if (bitmapRatio > 0) {
width = maxSize;
height = (int) (width / bitmapRatio);
} else {
height = maxSize;
width = (int) (height * bitmapRatio);
}
return Bitmap.createScaledBitmap(image, width, height, true);
}
使用它像:
Bitmap scaledImage = getResizedBitmap(photo, 200); //here 200 is maxsize
对于最高质量的图像(Q = 100),每个颜色像素需要大约8.25位
因此,对于200x200图像上的Q = 100,这将导致(200 * 200) px * 8.25 bits/px = 330000 bits = ~ 41 kB
肯定小于64KB
你也可以尝试其他方面..
您还可以尝试使用调整大小的位图制作图像,并比较图像的实际尺寸。
这是代码:
//create a file to write bitmap data
File f = new File(context.getCacheDir(), filename);
f.createNewFile();
//Convert bitmap to byte array
Bitmap bitmap = your bitmap;
ByteArrayOutputStream bos = new ByteArrayOutputStream();
bitmap.compress(CompressFormat.PNG, 0 /*ignored for PNG*/, bos);
byte[] bitmapdata = bos.toByteArray();
//write the bytes in file
FileOutputStream fos = new FileOutputStream(f);
fos.write(bitmapdata);
fos.flush();
fos.close();
答案 1 :(得分:0)
或者,您可以使用Compressor library使用更多可配置选项压缩图像。
您可以通过gradle将库添加到您的应用中:
dependencies {
compile 'id.zelory:compressor:1.0.4'
}
通过以下方式生成压缩图像:
compressedImage = new Compressor.Builder(this)
.setMaxWidth(640)
.setMaxHeight(480)
.setQuality(75)
.setCompressFormat(Bitmap.CompressFormat.WEBP)
.setDestinationDirectoryPath(Environment.getExternalStoragePublicDirectory(
Environment.DIRECTORY_PICTURES).getAbsolutePath())
.build()
.compressToFile(actualImage);