Защо запазването на растерно изображение отнема толкова време?

Така че имам приложение на 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();
            }
        }

Всякакви обяснения или предложения са добре дошли. Благодаря.


person MichaelAndroidNewbie    schedule 22.02.2015    source източник
comment
Защо запазването на растерно изображение отнема толкова време? -- използвайте Traceview и разберете. Сивото растерно изображение не се вижда напълно в паметта с помощта на Windows Photo Viewer, докато Google Glass не бъде изключен от компютъра за отстраняване на грешки и след това включен отново -- използвайте MediaScannerConnection и scanFile(), за да индексирате файла от MediaStore. Понякога може да се види половината от изображението в нива на сивото, но това е -- обадете се на getFD().sync() на FileOutputStream, след като се обадите на flush(), но преди да се обадите на close().   -  person CommonsWare    schedule 22.02.2015


Отговори (1)


Не използвам Google Glass, но се сблъсках със същия проблем. Така че ще документирам откритията си тук.

Запазването на растерното ми изображение отне много време. Отне ми почти 4 секунди, за да запазя растерно изображение с размер 1200x1200 и окончателният записан размер на файла беше 2 MB. Но нямах нужда от това ниво на яснота и размер на файла. Когато имам предвид „запазване“, това означава действителното записване само на диска, а не времето, необходимо на Android OS да го открие като медиен елемент.


РЕАЛНО ЗАПАЗВАНЕ: Опитайте следното, ако установите, че запазването на растерно изображение е бавно:

  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 в хранилището, операционната система Android няма веднага да покаже този файл във файловия мениджър или в изследователя, когато го свържете към вашия компютър. За да направите това откриване бързо, трябва да използвате MediaScannerConnection.

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