一連の画像からビデオを作成しようとしていますが、それらの画像は縦長または横長の可能性があります。最終的なビデオを横長にしたいので、縦長の画像を横長の画像のサイズにサイズ変更しています。明らかに、画質は非常に悪く、引き伸ばされます。再スケーリング後にビットマップを横向きモードに回転しようとしましたが、必要なものを達成できませんでした。私が欲しいのは、同じサイズの画像のセットだけです。サイズ変更中に縦長の画像の両側に黒いスペースがあったとしても、まったく問題ありません。
私がこれまでに試したこと:
Bitmap bmp = BitmapFactory.decodeFile(created_folder + File.separator + "pic00" + (k + 1) + ".jpg");
Matrix matrix = new Matrix();
if (image_orientaion == 6) {
matrix.postRotate(90);
} else if (image_orientaion == 3) {
matrix.postRotate(180);
} else if (image_orientaion == 8) {
matrix.postRotate(270);
}
//bmp = Bitmap.createBitmap(bmp, 0, 0, dm.widthPixels, (dm.widthPixels * bmp.getHeight() / bmp.getWidth()), matrix, true);
Log.e("The Iriginal Heihgt and Width is ","Width " + bmp.getWidth() + " Height " + bmp.getHeight());
if (bmp.getWidth() < bmp.getHeight()) {
bmp = scaleBitmap(bmp,bmp.getWidth(),bmp.getHeight());
Log.e("The Height and Wiedth after scalimg is "," Width : " + bmp.getWidth() + "Height : " + bmp.getHeight());
bmp = Bitmap.createBitmap(bmp, 0, 0, bmp.getHeight(), bmp.getWidth(), matrix, true);
} else {
bmp = RescalingBitmap(bmp);
Log.e("The Height and Wiedth after scalimg is "," Width : " + bmp.getWidth() + "Height : " + bmp.getHeight());
bmp = Bitmap.createBitmap(bmp, 0, 0, bmp.getWidth(), bmp.getHeight(), matrix, true);
}
// Log.e("The Bitmap height and width is ","Height is " + bmp.getHeight() + " Width is " + bmp.getWidth());
FileOutputStream fOut;
try {
fOut = new FileOutputStream(created_folder + File.separator + "pic00" + (k + 1) + ".jpg");
bmp.compress(Bitmap.CompressFormat.JPEG, 85, fOut);
fOut.flush();
fOut.close();
bmp.recycle();
} catch (FileNotFoundException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
public static Bitmap scaleBitmap(Bitmap bitmap, int wantedWidth, int wantedHeight) {
float originalWidth = bitmap.getWidth();
float originalHeight = bitmap.getHeight();
Bitmap output = Bitmap.createBitmap(wantedWidth, wantedHeight, Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(output);
Matrix m = new Matrix();
float scalex = wantedWidth/originalWidth;
float scaley = wantedHeight/originalHeight;
float xTranslation = 0.0f, yTranslation = (wantedHeight - originalHeight * scaley)/2.0f;
m.postTranslate(xTranslation, yTranslation);
m.preScale(scalex, scaley);
// m.setScale((float) wantedWidth / bitmap.getWidth(), (float) wantedHeight / bitmap.getHeight());
Paint paint = new Paint();
paint.setFilterBitmap(true);
canvas.drawBitmap(bitmap, m, paint);
return output;
}
他の代替案:
- ビットマップを圧縮しないようにしましたが、役に立ちませんでした。
- 画面サイズに合わせてビットマップの幅と高さを設定しようとしましたが、うまくいきませんでした。
- 縦長の画像の幅と高さを再割り当てして、それらの寸法が横長の画像の寸法になるようにしました。
ポートレート画像をランドスケープまたはランドスケープの寸法に再スケーリングする方法についてのアイデアはありますが、中央にポートレート画像があり、両側に黒いスペースがあるかどうかに関係なく?どんな助けや洞察も大歓迎です!
PS :
これらのビットマップ画像を使用してビデオを作成しているので、これを IMAGEVIEW に合わせるつもりはありません。縦向きのビットマップを同じ寸法の横向きのビットマップに変換するだけで、引き伸ばされていないことが私の目的です。
編集 :
コメント欄からのブディウスの提案によると、私はsetRectToRect
次のようにメソッドを使用しようとしましたが、それは私に大きな変化をもたらしませんでした.
Bitmap bmp = decodeFile(new File(created_folder + File.separator + "pic00" + (k + 1) + ".jpg"));
Matrix matrix = new Matrix();
float scale = 1024/bmp.getWidth();
float xTranslation = 0.0f, yTranslation = (720 - bmp.getHeight() * scale)/2.0f;
RectF drawableRect = new RectF(0, 0, bmp.getWidth()-100,
bmp.getHeight()-100);
RectF viewRect = new RectF(0, 0, bmp.getWidth(),
bmp.getHeight());
matrix.setRectToRect(drawableRect, viewRect, Matrix.ScaleToFit.CENTER);
matrix.setRotate(90, bmp.getWidth(), bmp.getHeight());
matrix.postTranslate(xTranslation, yTranslation);
matrix.preScale(scale, scale);
setRectToRect
と の後に適用するsetRotate
とpostTranslate
、画像は回転しませんが、縦向きモードで同じ画像が表示されます。すべての画像を横長モードにしたいのですが、回転を適用すると、結果の画像は次のようになります。伸ばしたくないだけです。その画像を通常の横長の画像のようにしたい、またはこのようにします。どんな助けでも大歓迎です。