ピクセルごとの編集を含むアンドロイドで画像処理を行う必要があります。これには少し時間がかかり、画面がそこでフリーズするだけなので、読み込みダイアログを実行して、プログラムがまだ実行中であることをユーザーに知らせたいと思いました。
この editPhoto 関数は、バックグラウンドで実行する必要があるものです。
private void editPhoto() {
if (editPhotoImg.getDrawable() == null) {
Toast.makeText(getApplicationContext(), "No Photo Selected",
Toast.LENGTH_SHORT).show();
} else if (hasSample == false) {
Toast.makeText(getApplicationContext(), "No Sample Photo Selected",
Toast.LENGTH_SHORT).show();
} else {
detectFaces(false);
BitmapDrawable ebm = (BitmapDrawable) editPhotoImg.getDrawable();
Bitmap editTemp = ebm.getBitmap();
PointF editFaceMidPoint = getFaceMidPoint(editTemp);
BitmapDrawable sbm = (BitmapDrawable) samplePhotoImg.getDrawable();
Bitmap sampleTemp = sbm.getBitmap();
PointF sampleFaceMidPoint = getFaceMidPoint(sampleTemp);
if (editFaceMidPoint != null && sampleFaceMidPoint != null) {
int editFaceMidPointPixel = editTemp.getPixel(
(int) editFaceMidPoint.x, (int) editFaceMidPoint.y);
int sampleFaceMidPointPixel = sampleTemp.getPixel(
(int) sampleFaceMidPoint.x, (int) sampleFaceMidPoint.y);
editPhotoImg.setImageBitmap(shiftRGB(editTemp,
editFaceMidPointPixel, sampleFaceMidPointPixel));
savePhoto();
detectFaces(true);
}
}
}
そして、これは私が望むものを達成しない私の AsyncTask コードです。識別さえできなかったエラーが表示されます。ロードダイアログの前後ではなく、ロードダイアログの後ろで実行されるように、何をすべきか、どこで editPhoto() メソッドを呼び出す必要があるか教えてもらえますか?
private class LoadEditPhoto extends AsyncTask<Void, Integer, Void> {
// Before running code in separate thread
@Override
protected void onPreExecute() {
/* Create a new progress dialog
progressDialog = new ProgressDialog(EditPhoto.this);
// Set the progress dialog to display a horizontal progress bar
progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
// Set the dialog title to 'Loading...'
progressDialog.setTitle("Loading...");
// Set the dialog message to 'Loading application View, please
// wait...'
progressDialog.setMessage("Loading application View, please wait...");
*/
progressDialog = ProgressDialog.show(EditPhoto.this,"Loading...",
"Editing Photo, please wait...", false, false);
// This dialog can't be canceled by pressing the back key
progressDialog.setCancelable(false);
// This dialog isn't indeterminate
progressDialog.setIndeterminate(false);
// The maximum number of items is 100
progressDialog.setMax(100);
// Set the current progress to zero
progressDialog.setProgress(0);
// Display the progress dialog
progressDialog.show();
}
// The code to be executed in a background thread.
@Override
protected Void doInBackground(Void... params) {
/*
* This is just a code that delays the thread execution 4 times,
* during 850 milliseconds and updates the current progress. This is
* where the code that is going to be executed on a background
* thread must be placed.
*
*/
editPhoto();
publishProgress(100);
return null;
}
// Update the progress
@Override
protected void onProgressUpdate(Integer... values) {
// set the current progress of the progress dialog
progressDialog.setProgress(values[0]);
}
// after executing the code in the thread
@Override
protected void onPostExecute(Void result) {
// close the progress dialog
progressDialog.dismiss();
}
}