export: improved memory management when exporting to BMP

This commit is contained in:
Thibault Deckers 2022-09-12 18:46:04 +02:00
parent 50467e7712
commit 761a45cad9
2 changed files with 12 additions and 7 deletions

View file

@ -20,6 +20,7 @@ All notable changes to this project will be documented in this file.
- opening viewer with directory context in some cases - opening viewer with directory context in some cases
- photo frame widget rendering in some cases - photo frame widget rendering in some cases
- exporting large images to BMP
## <a id="v1.6.13"></a>[v1.6.13] - 2022-08-29 ## <a id="v1.6.13"></a>[v1.6.13] - 2022-08-29

View file

@ -54,9 +54,8 @@ object BmpWriter {
val padPerRow = (4 - (biWidth * BYTE_PER_PIXEL) % 4) % 4 val padPerRow = (4 - (biWidth * BYTE_PER_PIXEL) % 4) % 4
val biSizeImage = (biWidth * BYTE_PER_PIXEL + padPerRow) * biHeight val biSizeImage = (biWidth * BYTE_PER_PIXEL + padPerRow) * biHeight
val bfSize = FILE_HEADER_SIZE + INFO_HEADER_SIZE + biSizeImage val bfSize = FILE_HEADER_SIZE + INFO_HEADER_SIZE + biSizeImage
val buffer = ByteBuffer.allocate(bfSize)
val pixels = IntArray(biWidth * biHeight) var buffer = ByteBuffer.allocate(FILE_HEADER_SIZE + INFO_HEADER_SIZE)
bitmap.getPixels(pixels, 0, biWidth, 0, 0, biWidth, biHeight)
// file header // file header
buffer.put(bfType) buffer.put(bfType)
@ -78,11 +77,17 @@ object BmpWriter {
buffer.put(biClrUsed) buffer.put(biClrUsed)
buffer.put(biClrImportant) buffer.put(biClrImportant)
outputStream.write(buffer.array())
// pixels // pixels
buffer = ByteBuffer.allocate(biWidth * BYTE_PER_PIXEL + padPerRow)
val pixels = IntArray(biWidth)
val rgb = ByteArray(BYTE_PER_PIXEL) val rgb = ByteArray(BYTE_PER_PIXEL)
var value: Int var value: Int
var row = biHeight - 1 var row = biHeight - 1
while (row >= 0) { while (row >= 0) {
bitmap.getPixels(pixels, 0, biWidth, 0, row, biWidth, 1)
var column = 0 var column = 0
while (column < biWidth) { while (column < biWidth) {
/* /*
@ -91,7 +96,7 @@ object BmpWriter {
green: (value shr 8 and 0xFF).toByte() green: (value shr 8 and 0xFF).toByte()
blue: (value and 0xFF).toByte() blue: (value and 0xFF).toByte()
*/ */
value = pixels[row * biWidth + column] value = pixels[column]
// blue: [0], green: [1], red: [2] // blue: [0], green: [1], red: [2]
rgb[0] = (value and 0xFF).toByte() rgb[0] = (value and 0xFF).toByte()
rgb[1] = (value shr 8 and 0xFF).toByte() rgb[1] = (value shr 8 and 0xFF).toByte()
@ -102,10 +107,9 @@ object BmpWriter {
if (padPerRow > 0) { if (padPerRow > 0) {
buffer.put(pad, 0, padPerRow) buffer.put(pad, 0, padPerRow)
} }
outputStream.write(buffer.array())
buffer.clear()
row-- row--
} }
// write to output stream
outputStream.write(buffer.array())
} }
} }