カメラアプリケーションを作っています。また、カメラをクリックしてサーバーにアクセスした後、画像を保存する必要があります。キャプチャされた画像のサイズは常に非常に大きいため(Mb単位)。そのため、大きなサイズの画像をサーバーに保存することは常に困難です。保存する前に画像を圧縮するものはありますか?
そして、私はアンドロイドネイティブカメラのみを使用する必要があります
ありがとう
カメラアプリケーションを作っています。また、カメラをクリックしてサーバーにアクセスした後、画像を保存する必要があります。キャプチャされた画像のサイズは常に非常に大きいため(Mb単位)。そのため、大きなサイズの画像をサーバーに保存することは常に困難です。保存する前に画像を圧縮するものはありますか?
そして、私はアンドロイドネイティブカメラのみを使用する必要があります
ありがとう
実際にサーバーにアップロードする前に、ビットマップのサイズを変更する必要があります。このコードは、サイズ変更されたビットマップを返します。ビットマップを必要な幅と必要な高さに減らします。これにより、画像ファイルがはるかに小さくなります。
public static Bitmap getBitmapImages(final String imagePath, final int requiredWidth, final int requiredHeight)
{
System.out.println(" --- image_path in getBitmapForCameraImages --- "+imagePath+" - reqWidth & reqHeight "+requiredWidth+" "+requiredHeight);
Bitmap bitmap = null;
BitmapFactory.Options options = new BitmapFactory.Options();
options.inScaled = true;
options.inJustDecodeBounds = true;
// First decode with inJustDecodeBounds=true to check dimensions
bitmap = BitmapFactory.decodeFile(imagePath, options);
// Calculate inSampleSize
options.inSampleSize = calculateInSampleSize(options, requiredWidth, requiredHeight);
options.inJustDecodeBounds = false;
// Decode bitmap with inSampleSize set
bitmap = BitmapFactory.decodeFile(imagePath, options);
return bitmap;
}
別のアプローチは、小さな写真を直接作成することです。利点は、使用するメモリが少ないことですが、アプリの別の部分で全体像が必要になる場合があります。
これは次のように実行できます。
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height){
...
Camera.Parameters mParameters = mCamera.getParameters();
List<Size> sizes = mParameters.getSupportedPictureSizes();
Size optimalSize = getOptimalSize(sizes, width, height);
if (optimalSize != null && !mParameters.getPictureSize().equals(optimalSize))
mParameters.setPictureSize(optimalSize.width, optimalSize.height);
...
}
最適なサイズを選択するには、任意の基準を使用できます。私はそれを画面サイズにできるだけ近づけようとしました:
private Size getOptimalSize(List<Size> sizes, int w, int h){
final double ASPECT_TOLERANCE = 0.05;
double targetRatio = (double) w / h;
if (sizes == null)
return null;
Size optimalSize = null;
double minDiff = Double.MAX_VALUE;
int targetHeight = h;
for (Size size: sizes)
{
double ratio = (double) size.width / size.height;
if (Math.abs(ratio - targetRatio) > ASPECT_TOLERANCE)
continue;
if (Math.abs(size.height - targetHeight) < minDiff)
{
optimalSize = size;
minDiff = Math.abs(size.height - targetHeight);
}
}
if (optimalSize == null)
{
minDiff = Double.MAX_VALUE;
for (Size size: sizes)
{
if (Math.abs(size.height - targetHeight) < minDiff)
{
optimalSize = size;
minDiff = Math.abs(size.height - targetHeight);
}
}
}
return optimalSize;
}
これを試して
Bitmap bmp = (Bitmap) data.getExtras().get("data");
ByteArrayOutputStream stream = new ByteArrayOutputStream();
bmp.compress(Bitmap.CompressFormat.PNG, 100, stream);