2014-10-31 2 views
1

Я успешно добавил водяной знак к просмотру изображения камеры, которое пользователь берет на свое приложение для Android, однако, когда он отправляется в Instagram или Tumblr, водяной знак isn ' там. Я считаю, что это связано с тем, что он использует изображение из локального хранилища и не имеет ничего общего с предварительным просмотром.Добавьте водяной знак к фотографии до того, как он поделился в социальных сетях

Мне кажется, мне нужно изменить код «снимок» для камеры, так что когда он берет фотографию, она преобразует ее в растровое изображение, добавляет ее к холсту с водяным знаком, а затем сохраняет его, Я не знаю, как это сделать.

Я считаю, что это источник файла, который совместно

final File fileToUpload = new File(StorageUtils.getStoragePath(ShareActivity.this), StorageUtils.DEFAULT_IMAGE); 

Вот код картины взять для камеры.

protected void takePicture() { 
    if (cameraPreview == null) return; 
    Camera camera = cameraPreview.getCamera(); 
    if (camera == null) return; 

    camera.takePicture(null, null, null, new Camera.PictureCallback() { 
     @Override 
     public void onPictureTaken(byte[] data, Camera camera) { 
      if (data == null || data.length == 0) return; 

      File imageFile = new File(StorageUtils.getStoragePath(CameraActivity.this), StorageUtils.DEFAULT_IMAGE); 
      File parentDir = imageFile.getParentFile(); 

      if (!parentDir.exists()) { 
       if (!parentDir.mkdirs()) { 

        Log.d(TAG, "Failed to create directory: " + parentDir.getAbsolutePath()); 
        return; 
       } 
      } 

      try { 
       FileOutputStream fos = new FileOutputStream(imageFile); 
       fos.write(data); 
       fos.close(); 
      } catch (IOException e) { 

       Log.d(TAG, "Failed to save file: " + imageFile.getAbsolutePath()); 
       e.printStackTrace(); 
       return; 
      } 

      //workaround for bug with facing camera introduced (intentionally?) in 4.0+ 
      if (isCameraFacingFront && Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) { 
       Bitmap bitmap = BitmapFactory.decodeFile(imageFile.getAbsolutePath()); 
       Matrix matrix = new Matrix(); 
       //flip image vertically 
       matrix.setRotate(180); 
       matrix.postScale(-1, 1); 
       Bitmap rotatedBitmap = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, false); 
       bitmap.recycle(); 
       try { 
        rotatedBitmap.compress(Bitmap.CompressFormat.JPEG, 80, new FileOutputStream(imageFile)); 
        rotatedBitmap.recycle(); 
       } catch (FileNotFoundException e) { 
        Log.d(TAG, "Failed to rotate and save bitmap: " + imageFile.getAbsolutePath()); 
        e.printStackTrace(); 
        return; 
       } 
      } 

      Intent intent = new Intent(CameraActivity.this, ShareActivity.class); 
      intent.putExtra(ShareActivity.PARAM_IMAGE_FILE, imageFile.getAbsolutePath()); 
      if (business != null) 
       intent.putExtra(ShareActivity.PARAM_BUSINESS, business); 
      startActivity(intent); 
     } 
    }); 
} 

Или я могу быть вне базы. Любая помощь или указание в правильном направлении очень ценится! Спасибо!

+1

Вы на правильном пути. После того, как вы получили изображение, расшифруйте его, создайте для него новый холст, нарисуйте водяной знак на холсте и сохраните это изображение. Вы почти просто собираетесь повторить код для перелистывания изображения, просто рисуя на холсте прямо перед сохранением нового изображения. – Guardanis

ответ

1

Добавляя к моему комментарию: «Вы на правильном пути. После того, как вы получили изображение, расшифруйте его, создайте для него новый холст, нарисуйте водяной знак на холсте и сохраните это изображение. «вновь в значительной степени только собирается повторить код для листать изображения, просто рисунок на холсте прямо перед сохранением нового образа" ...

я заскучал и сделал это для вас:.

protected void takePicture() { 
    if (cameraPreview == null) return; 
    Camera camera = cameraPreview.getCamera(); 
    if (camera == null) return; 

    camera.takePicture(null, null, null, new Camera.PictureCallback() { 
     public void onPictureTaken(byte[] data, Camera camera) { 
      File imageFile = new File(StorageUtils.getStoragePath(CameraActivity.this), StorageUtils.DEFAULT_IMAGE); 
      File parentDir = imageFile.getParentFile(); 
      if(!createImageFromCamera(data, imageFile, parentDir) return; 

      //workaround for bug with facing camera introduced (intentionally?) in 4.0+ 
      boolean requiresImageFlip = isCameraFacingFront && Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH; 

      Bitmap adjustedBitmap = getBitmap(imageFile, requiresImageFlip); 
      if(!drawWatermark(adjustedBitmap)) return; 
      if(!saveImage(imageFile, adjustedBitmap)) return; 

      Intent intent = new Intent(CameraActivity.this, ShareActivity.class); 
      intent.putExtra(ShareActivity.PARAM_IMAGE_FILE, imageFile.getAbsolutePath()); 
      if(business != null) intent.putExtra(ShareActivity.PARAM_BUSINESS, business); 
      startActivity(intent); 
     } 
    }); 
} 

private Bitmap getBitmap(File imageFile, boolean flipVertically){ 
    Bitmap bitmap = BitmapFactory.decodeFile(imageFile.getAbsolutePath()); 
    Matrix matrix = new Matrix(); 

    if(flipVertically){ 
     matrix.setRotate(180); 
     matrix.postScale(-1, 1); 
    } 

    Bitmap adjustedBitmap = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, false); 
    bitmap.recycle(); 

    return adjustedBitmap; 
} 

private boolean saveImage(File imageFile, Bitmap bitmap){ 
    try { 
     bitmap.compress(Bitmap.CompressFormat.JPEG, 80, new FileOutputStream(imageFile)); 
     bitmap.recycle(); 
     return true; 
    } 
    catch (FileNotFoundException e) { 
     Log.d(TAG, "Failed to rotate and save bitmap: " + imageFile.getAbsolutePath()); 
     e.printStackTrace(); 
     return false; 
    } 
} 

private boolean drawWatermark(Bitmap bitmap){ 
    try{ 
     Canvas canvas = new Canvas(bitmap); 
     canvas.drawBitmap(watermarkBitmap); // However you're drawing the watermark on the canvas 
     return true; 
    } 
    catch(Exception e){ 
     e.printStackTrace(); 
     return false; 
    } 
} 

private boolean createImageFromCamera(byte[] data, File imageFile, File parentDir){ 
    if (data == null || data.length == 0) return false; 

    if (!parentDir.exists()) { 
     if (!parentDir.mkdirs()) { 
      Log.d(TAG, "Failed to create directory: " + parentDir.getAbsolutePath()); 
      return false;  
     }   
    } 

    try { 
     FileOutputStream fos = new FileOutputStream(imageFile); 
     fos.write(data); 
     fos.close(); 
    } 
    catch (IOException e) { 
     Log.d(TAG, "Failed to save file: " + imageFile.getAbsolutePath()); 
     e.printStackTrace(); 
     return false; 
    } 

    return true; 
} 

Замените весь ваш метод takePicture(), и он должен делать все, что вы ищете.

+0

Спасибо! Кажется, он исправляет все забавные ошибки, которые я пытался решить самостоятельно, но когда я делаю снимок, теперь получаю java.lang.RuntimeException: takePicture не удалось: camera.takePicture (null, null, null , new Camera.PictureCallback() {Я попытаюсь устранить проблему, но если вы знаете, что происходит, это тоже хорошо! – Cassandra

+0

Вы очень желанны! И хм, ваш логарифм должен указать на линию где происходит исключение, или нет? Или может быть проблема связана с вызовом камеры? – Guardanis

+0

Я прокомментировал эти две строки, которые указывал логарифм, и это не сработает? Еще раз спасибо за ваш время (if drawWatermark (adjustBitmap)) return; if (! saveImage (imageFile, adjustBitmap)) return; – Cassandra