簡體   English   中英

將android camera2圖像保存為無損PNG

[英]Saving an android camera2 image to lossless PNG

我正在嘗試將android.hardware.camera2圖像保存為無損格式。

我使用scrounged位代碼使用JPEG(有損)和DMG(原始的,但很大,很難處理):

private fun save(image: Image, captureResult: TotalCaptureResult) {
    val fileWithoutExtension = File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM), "myimage_${System.currentTimeMillis()}")
    val file: File = when (image.format) {
        ImageFormat.JPEG -> {
            val buffer = image.planes[0].buffer
            val bytes = ByteArray(buffer.remaining())
            buffer.get(bytes)
            val file = File("$fileWithoutExtension.jpg")
            file.writeBytes(bytes)
            file
        }
        ImageFormat.RAW_SENSOR -> {
            val dngCreator = DngCreator(mode.characteristics, captureResult)
            val file = File("$fileWithoutExtension.dmg")
            FileOutputStream(file).use { os ->
                dngCreator.writeImage(os, image)
            }
            file
        }
        else -> TODO("Unsupported image format: ${image.format}")
    }
    Log.i(TAG, "Wrote image:${file.canonicalPath} ${file.length() / 1024}k")
    image.close() // necessary when taking a few shots
}

但我堅持認為用一些可以保存到更合理的PNG的東西替換RAW_SENSOR部分。 是嗎

  1. 一個壞主意,因為RAW_SENSOR與普通的圖像格式是如此不同,以至於我不得不經歷太多的痛苦來轉換它?
  2. 一個壞主意,因為我應該設置上游捕獲來捕獲更合理的東西,如FLEX_RGB_888?
  3. 一個好主意,因為以下代碼中存在一些愚蠢的錯誤? Buffer not large enough for pixels at android.graphics.Bitmap.copyPixelsFromBuffer(Bitmap.java:593)使用Buffer not large enough for pixels at android.graphics.Bitmap.copyPixelsFromBuffer(Bitmap.java:593)

我的嘗試:

fun writeRawImageToPng(image: Image, pngFile: File) {
    Bitmap.createBitmap(image.width, image.height, Bitmap.Config.ARGB_8888).let { latestBitmap->
        latestBitmap.copyPixelsFromBuffer(image.planes[0].buffer!!)
        ByteArrayOutputStream().use { baos ->
            latestBitmap.compress(Bitmap.CompressFormat.PNG, 100, baos)
            pngFile.writeBytes(baos.toByteArray())
        }
    }
}

RAW_SENSOR真的很難。 規范告訴我們,可以從CameraDevice檢索底層Bayer鑲嵌的參數,但是沒有公共API將其轉換為Bitmap

無論如何,如果您的目標是將其轉換為每通道8位位圖,那么請求這種棘手的格式是沒有優勢的。

此外,用於捕獲圖像的ARGB_8888位圖可能很大,如果您不夠小心,則會導致內存不足。

您想要以YUV_420_888格式捕獲數據; 這就是JPEG壓縮器在任何情況下的開始。

你必須自己將它轉換為RGB位圖,但是沒有方便的方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM