Я написал образец приложения, которое позволяет пользователю Android делать снимки и иметь текстовый контент из представления в виде наложения на изображение и сохранять его в альбоме галереи:
Я хотел бы преобразовать растровое изображение текста перед объединением двух изображений. В частности, я хотел бы сделать текст изогнутым вверх по бокам (имитируя обертывание цилиндра) и сделать его больше вверху, чем внизу (имитируя перспективу сверху вниз), как показано здесь:
Нет необходимости интерпретировать изображение камеры, чтобы определить величину изменения кривизны или перспективы. Вопрос в том, как манипулировать растровым изображением, чтобы можно было выполнить два преобразования.
Вот код, который я использовал для получения непреобразованного текста на изображении камеры и в галерее:
private void combinePictureWithText(String fileName) {
Log.v(TAG, "combinePictureWithText");
int targetW = getWindowManager().getDefaultDisplay().getWidth();
int targetH = getWindowManager().getDefaultDisplay().getHeight();
/* Get the size of the image */
BitmapFactory.Options bmOptions = new BitmapFactory.Options();
bmOptions.inJustDecodeBounds = true;
BitmapFactory.decodeFile(fileName, bmOptions);
int photoW = bmOptions.outWidth;
int photoH = bmOptions.outHeight;
/* Figure out which way needs to be reduced less */
int scaleFactor = 1;
if ((targetW > 0) || (targetH > 0)) {
scaleFactor = Math.min(photoW/targetW, photoH/targetH);
}
Log.v(TAG, "Scale Factor: " + scaleFactor);
/* Set bitmap options to scale the image decode target */
bmOptions.inJustDecodeBounds = false;
bmOptions.inSampleSize = scaleFactor;
bmOptions.inPurgeable = true;
mBeerLayout.setDrawingCacheEnabled(true);
Bitmap mDrawingCache = mBeerLayout.getDrawingCache();
Bitmap cameraBitmap = BitmapFactory.decodeFile(fileName, bmOptions);
Bitmap textBitmap = Bitmap.createBitmap(mDrawingCache);
Bitmap combinedBitmap = Bitmap.createBitmap(targetW, targetH, Bitmap.Config.ARGB_8888);
Canvas comboImage = new Canvas(combinedBitmap);
cameraBitmap = Bitmap.createScaledBitmap(cameraBitmap, targetW, targetH, true);
comboImage.drawBitmap(cameraBitmap, 0, 0, null);
comboImage.drawBitmap(textBitmap, 0, 0, null); // WAS: matrix (instead of 0, 0)
/* Save to the file system */
Log.v(TAG, "save combined picture to the file system");
try {
File aFile = new File(fileName);
if (aFile.exists()) {
Log.v(TAG, "File " + fileName + " existed. Deleting it.");
//aFile.delete();
} else {
Log.v(TAG, "File " + fileName + " did not exist.");
}
FileOutputStream out = new FileOutputStream(fileName);
combinedBitmap.compress(Bitmap.CompressFormat.JPEG, 90, out);
out.flush();
out.close();
Log.v(TAG, "Saved " + fileName);
} catch (Exception e) {
Log.v(TAG, "Failed in file output stream " + e.getMessage());
}
/* Associate the Bitmap to the ImageView */
//mImageView.setImageBitmap(combinedBitmap); // DRS was "bitmap"
//mImageView.setVisibility(View.VISIBLE);
/* Add as a gallery picture */
Log.v(TAG, "galleryAddPic");
Intent mediaScanIntent = new Intent("android.intent.action.MEDIA_SCANNER_SCAN_FILE");
File f = new File(fileName);
Uri contentUri = Uri.fromFile(f);
mediaScanIntent.setData(contentUri);
this.sendBroadcast(mediaScanIntent);
}
Этот вопрос / answer может предоставить подробную информацию о том, как изменить перспективу, но я не верю, что он отвечает на вопрос о моделировании обтекания текста вокруг цилиндра.
OpenGL
,GLSurfaceView.Renderer
и т. Д. - person Dale   schedule 17.03.2017