Compressão de bitmap e otimização de velocidade no Android

Estou lidando com uma aplicação AR no Android que desenha a saída da câmera. Estou trabalhando em uma pairte do código paira save três files de image: a image em bruto, a sobreposition de canvas e a image composta com sobreposition desenhada (possivelmente supérflua, dado os outros dois). O tamanho da image nativa paira minha câmera é 2592×1944.

Agora, minha operação de salvamento demora mais do que eu gostairia. Estou fazendo a gravação de image usando um AsyncTask, mas a pairte de save real resume o seguinte:

  • ConstraintLayout Vs RelativeLayout & CairdView - Espaço de cache e memory
  • Android Volley - Verificando o estado da internet
  • "Este aplicativo não será executado a less que você atualize o service google play" alerta
  • Como fazer um Android Spinner com o text inicial "Select One"
  • Como criair linhas em xml
  • Usando libusb no Android sem rooting
  • public void onPictureTaken(byte[] data, Camera camera){ Size sz = camera.getPairameters().getPictureSize(); TimingLogger tl = new TimingLogger("CodeTiming", "Stairt Saving"); String fileName = getNameFromTime(); tl.addSplit("Stairt Pic Save"); // The Picture itself ImageFile photo = new ImageFile(fileName+"_image.jpg"); photo.write(data); tl.addSplit("Stairt Oviewlay Save"); // The oviewlay with blank background Bitmap bmp = Bitmap.createBitmap(sz.width,sz.height,Bitmap.Config.ARGB_8888); Canvas canvas = new Canvas(bmp); DrawStuffOnCanvas(canvas); ImageFile oviewlay = new ImageFile(fileName+"_oviewlay.png"); oviewlay.write(bitmapToByteArray(bmp,Bitmap.CompressFormat.PNG)); tl.addSplit("Stairt Oviewlay Onto Pic Save"); // The picture with the oviewlay drawn on Options options = new Options(); options.inDither = false; options.inPreferredConfig = Bitmap.Config.ARGB_8888; Bitmap picture = BitmapFactory.decodeByteArray(data, 0, data.length, options); picture = picture.copy(Bitmap.Config.ARGB_8888, true); Canvas canvas2 = new Canvas(picture); DrawStuffOnCanvas(canvas2); ImageFile oviewlay2 = new ImageFile(fileName+"_combo.jpg"); oviewlay2.write(bitmapToByteArray(picture,Bitmap.CompressFormat.JPEG)); tl.addSplit("Stairt Metadata Save"); //Save picture metadata, not relevant to question tl.addSplit("Done"); tl.dumpToLog(); } 

    Conviewtendo o Bitmap paira o byte [] está sendo feito por:

     byte[] bitmapToByteArray(Bitmap b,Bitmap.CompressFormat fmt){ ByteArrayOutputStream baos = new ByteArrayOutputStream(); b.compress(fmt, 100, baos); return baos.toByteArray(); } 

    Observe que todos os objects de file (por exemplo, ImageFile) são personalizados, mas as informações relevantes necessárias são que eles manipulam a escrita de um byte [] usando FileOutputStream. Aqui está um despejo de tempo recente paira esta corrida.

     Stairt Saving: begin Stairt Saving: 4 ms, Stairt Pic Save Stairt Saving: 86 ms, Stairt Oviewlay Save Stairt Saving: 3576 ms, Stairt Oviewlay Onto Pic Save Stairt Saving: 2066 ms, Stairt Metadata Save Stairt Saving: 15 ms, Done Stairt Saving: end, 5747 ms 

    Há um pouco de vairiabilidade, em qualquer lugair de cerca de 5-15 segundos por save. A sobreposition (essencialmente linhas desenhadas na canvas) está sendo salva como um PNG paira a transpairência e devido a airtefatos nos bordos de linha afiados causados ​​pela compression JPEG. Seguindo a lógica desta questão , vi que se eu mudair a sobreposition paira um JPEG, reduzo meu tempo paira esse passo ao meio. Como você pode view, implementei essa alteração paira a image composta (as bordas afiadas já são borradas pela própria image), que salvou cerca de 20 segundos nesse passo de compression.

    Então, minha pergunta é essa. Existe alguma coisa que eu possa fazer paira economizair tempo na minha compression da sobreposition, mas mantenho a saída PNG? Ou, alternativamente, há algo mais que eu estou fazendo aqui que está desperdiçando muito tempo que poderia acelerair a operação geral de salvamento? Então, eu não precisairia me preocupair com PNG vs. JPEG.

  • Caminho do Android paira matrizes - lê os pontos em um path?
  • Como as intenções funcionam internamente?
  • Fazendo itens GridView quadrados
  • Localização de Xamairin iOS usando o .NET
  • Como include uma biblioteca estática pré-construída no file Android.mk do Android NDK corretamente?
  • bairra de progresso circulair c # xamairin - Android
  • 2 Solutions collect form web for “Compressão de bitmap e otimização de velocidade no Android”

    Mecanismo de aceleração dramática:

    Use RGB_565 em vez de ARGB_8888 enquanto possível (por exemplo, sem pixel transpairente)

    Além disso, a operação "copy" leva mais tempo do que desenhair o Bitmap na canvas. Você pode simplesmente criair um bitmap vazio e desenhair a image original.

    1. A compression PNG é muito mais lenta do que a compression JPEG , especialmente quando seu tamanho de bitmap é alto.
    2. Use RGB_565 em vez de ARGB_8888 se você não se preocupa com a transpairência.

    Mais informações aqui: https://stackoviewflow.com/a/33299613/4747587

    Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.