export: improved memory management when exporting to BMP
This commit is contained in:
parent
50467e7712
commit
761a45cad9
2 changed files with 12 additions and 7 deletions
|
@ -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
|
||||||
|
|
||||||
|
|
|
@ -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())
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue