2015-02-22 10 views
2

Поэтому у меня есть приложение на Google Glass, что делает снимок, а затем преобразует его в оттенки серого и перезаписывает исходное изображение в памяти:Зачем сохранять растровые изображения так долго?

private void rGBProcessing (final String picturePath, Mat image) { 
//BitmapFactory Creates Bitmap objects from various sources, 
//including files, streams, and byte-arrays 
    Bitmap myBitmapPic = BitmapFactory.decodeFile(picturePath); 
    image = new Mat(myBitmapPic.getWidth(), myBitmapPic.getHeight(), CvType.CV_8UC4); 
    Mat imageTwo = new Mat(myBitmapPic.getWidth(), myBitmapPic.getHeight(), CvType.CV_8UC1); 
    Utils.bitmapToMat(myBitmapPic, image); 
    Imgproc.cvtColor(image, imageTwo, Imgproc.COLOR_RGBA2GRAY); 
    Utils.matToBitmap(imageTwo, myBitmapPic); 

    FileOutputStream out = null; 
    try { 
     out = new FileOutputStream(picturePath); 
     myBitmapPic.compress(Bitmap.CompressFormat.PNG, 100, out); 
    // PNG is a lossless format, the compression factor (100) is ignored 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } finally { 
     try { 
      if (out != null) { 
       out.close(); 
      } 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 

серый растровое не является полностью видимым в памяти с помощью Windows Photo Viewer, пока Google Glass отключен от отладочного компьютера, а затем снова подключен. Иногда можно просматривать половину изображения в оттенках серого, но это все. Я изменил код, чтобы показать изображение, а не сохранить его во внутреннюю память, и это было быстро и успешно, который заставляет меня думать, что проблема с чтением полутонового изображения во внутреннюю память:

FileOutputStream out = null; 
     try { 
      out = new FileOutputStream(picturePath); 
      myBitmapPic.compress(Bitmap.CompressFormat.PNG, 100, out); 
     // PNG is a lossless format, the compression factor (100) is ignored 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } finally { 
      try { 
       if (out != null) { 
        out.close(); 
       } 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
     } 

Любых объяснения или предложения приветствуются , Благодарю.

+1

«Почему сохранение растрового изображения занимает так много времени?» - используйте Traceview и узнайте. «Серый растровый рисунок не полностью отображается в памяти с помощью Windows Photo Viewer до тех пор, пока Google Glass не будет отключен от отладочного компьютера, а затем снова подключен» - используйте «MediaScannerConnection» и «scanFile()», чтобы получить файл, индексированный с помощью ' MediaStore'. «Иногда можно просмотреть половину изображения в оттенках серого, но это все» --call 'getFD(). Sync()' в 'FileOutputStream' после вызова' flush() ', но прежде чем вы вызовете' close() '. – CommonsWare

ответ

5

Я не пользуюсь Google Glass, но столкнулся с этой же проблемой. Поэтому я собираюсь задокументировать мои результаты здесь.

Мое растровое изображение занимало много времени, чтобы сэкономить. Мне потребовалось около 4 секунд, чтобы сохранить растровое изображение размером 1200x1200, а окончательный размер сохраненного файла составил 2 МБ. Но мне не нужен этот уровень ясности и размер файла. Когда я имею в виду «сохранить», это означает фактическое сохранение только на диске, а не время, которое требуется ОС Android, чтобы определить его как элемент мультимедиа.


АКТУАЛЬНО SAVE: Попробуйте следующее, если вы найдете сохранение растрового изображения будет медленным:

  1. Попробуйте использовать формат JPEG и использовать PNG только тогда, когда это абсолютно необходимо. Использование bitmap.compress(Bitmap.CompressFormat.JPEG, 100, out);
  2. Если вы создаете растровое изображение, и вы не заботитесь о прозрачности, а затем использовать Bitmap.Config.RGB_565 вместо Bitmap.Config.ARGB_8888.

    Использование Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.RGB_565);


ОБНАРУЖЕНИЕ В FILE MANAGER:

После того, как вы сохранили растровое изображение как File в хранении, Android OS не будет сразу показывать этот файл Диспетчер файлов или в проводнике при подключении к ПК. Чтобы быстро выполнить это обнаружение, вам необходимо использовать MediaScannerConnection.

MediaScannerConnection.scanFile(getActivity(), new String[]{file.toString()}, null, null); 

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

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