2014-11-23 3 views
0

Я использую намерение захватить изображение с помощью приложения для фотоаппаратов на складе. На самом деле это пример кода с сайта разработчиков Android, о том, как делать фотографии просто, с некоторыми настройками, которые соответствуют потребностям моего приложения.Android - Как сделать водяное знаком изображение перед его сохранением

public void dispatchTakePictureIntent(int actionCode) { 

    Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 

     File f = null; 
     try { 
      f = setUpPhotoFile(); 
      mCurrentPhotoPath = f.getAbsolutePath(); 
      takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(f)); 
     } catch (IOException e) { 
      e.printStackTrace(); 
      f = null; 
      mCurrentPhotoPath = null; 
     } 
    startActivityForResult(takePictureIntent, actionCode); 
} 



@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    mImageBitmap = null; 

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.FROYO) { 
     mAlbumStorageDirFactory = new FroyoAlbumDirFactory(); 
    } else { 
     mAlbumStorageDirFactory = new BaseAlbumDirFactory(); 
    } 
    dispatchTakePictureIntent(ACTION_TAKE_PHOTO); 
} 

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    if (resultCode == RESULT_OK) { 
     if (mCurrentPhotoPath != null) { 
      Intent mediaScanIntent = new Intent("android.intent.action.MEDIA_SCANNER_SCAN_FILE"); 
      File f = new File(mCurrentPhotoPath); 
      Uri contentUri = Uri.fromFile(f); 
      mediaScanIntent.setData(contentUri); 
      this.sendBroadcast(mediaScanIntent); 
      mCurrentPhotoPath = null; 
     } 
     dispatchTakePictureIntent(ACTION_TAKE_PHOTO); 
    } 
    else{ 
    finish(); 
    } 
} 

и метод, который содержит водяные знаки растрового изображения со строкой.

public static Bitmap mark(Bitmap src, String watermark) { 
    int w = src.getWidth(); 
    int h = src.getHeight(); 
    Bitmap result = Bitmap.createBitmap(w, h, src.getConfig()); 
    Canvas canvas = new Canvas(result); 
    canvas.drawBitmap(src, 0, 0, null); 
    Paint paint = new Paint(); 
    paint.setColor(Color.RED); 
    paint.setTextSize(18); 
    paint.setAntiAlias(true); 
    paint.setUnderlineText(true); 
    canvas.drawText(watermark, 20, 25, paint); 

    return result; 
} 

Проблема заключается в том, что я не могу получить растровое изображение для использования этого метода.

Большое спасибо заранее!

+0

Создание растрового изображения из данных, возвращаемых камерой – Praveen

+0

я могу преобразовать файл F в растровом изображении, а затем использовать метод метки, но после того, что? – Vissarionas

+0

Сохраните его в файле – Praveen

ответ

0

Вы передаёте файл Uri, чтобы сохранить сделанное изображение. Поэтому попробуйте это. Я изменил ваш метод onActivityResult.

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
if (resultCode == RESULT_OK) { 
    if (mCurrentPhotoPath != null) { 
     Intent mediaScanIntent = new Intent("android.intent.action.MEDIA_SCANNER_SCAN_FILE"); 
     File f = new File(mCurrentPhotoPath); 
     Uri contentUri = Uri.fromFile(f); 
     Bitmap photo = Media.getBitmap(getContentResolver(), contentUri); 
     photo=mark(photo, yourWatreStringHere); 
     OutputStream fOut = null; 
     fOut = new FileOutputStream(f); 
     photo.compress(Bitmap.CompressFormat.JPEG, 85, fOut); // saving the Bitmap to a file compressed as a JPEG with 85% compression rate 
     fOut.flush(); 
     fOut.close(); // do not forget to close the stream 
     mediaScanIntent.setData(contentUri); 
     this.sendBroadcast(mediaScanIntent); 
     mCurrentPhotoPath = null; 
    } 
    dispatchTakePictureIntent(ACTION_TAKE_PHOTO); 
} 
else{ 
finish(); 
} 
} 
+0

Man, спасибо большое за ваше терпение. Я пробовал это, и он работает без метода mark(). Я тоже поставил его в asynctask, и он отлично работает, но он вращает изображение. Я понимаю это как-то. Проблема должна быть в методе mark(). какие-либо предложения? – Vissarionas

+0

Большинство телефонных камер - это пейзаж, а это означает, что если вы возьмете фотографию в портрете, полученные фотографии будут повернуты на 90 градусов. В этом случае программное обеспечение камеры должно заполнять данные EXIF ​​с ориентацией на просмотр фотографии. Посмотрите на этот вопрос http://stackoverflow.com/questions/14066038/why-image-captured-using-camera-intent -gets повернутых-на-некоторых-устройств-в-андроида – Praveen

 Смежные вопросы

  • Нет связанных вопросов^_^