Ich habe eine Beispielanwendung geschrieben, mit der der Android-Benutzer ein Bild aufnehmen und den Textinhalt aus einer Ansicht als Überlagerung auf dem Bild speichern und in einem Galeriealbum speichern kann :So wandeln Sie ein Android-Bitmap in einen Zylinder um und ändern die Perspektive
Was bevor er die beiden Bilder, die ich möchte, ist, den Text Bitmap transformieren. Insbesondere möchte ich, dass der Text an den Seiten hochkant wird (Simulation der Umschlingung eines Zylinders) und oben größer gemacht wird als der Boden (simuliert eine perspektivische Ansicht von oben), wie hier dargestellt:
Es ist nicht notwendig, das Kamerabild zu interpretieren, um die Größe der Krümmung oder der Perspektive zu bestimmen. Die Frage ist, wie man die Bitmap so manipuliert, dass die beiden Transformationen gemacht werden können.
Hier ist der Code, den ich verwenden, um den nicht-transformierten Text in das Kamerabild zu erhalten und in die Galerie:
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);
}
Diese question/answer könnten Informationen geben, wie die Perspektive Veränderung zu tun, aber ich glaube nicht, Es beantwortet die Frage nach der Simulation des Einwickelns von Text um einen Zylinder.
Hast du Antwort auf diese finden? –
@selva_pollachi, es gibt noch keine Antwort. Ich habe vor, diese Frage mit meinen Fortschritten beizubehalten. Ich nehme an, dass die Antwort "OpenGL", "GLSurfaceView.Renderer" usw. enthalten wird. – Dale
okay dude.Wenn Sie Antwort in nativem als OpenGL finden, geben Sie hier –