Я пытаюсь прочитать двоичный файл, используя Java / Kotlin, но у меня проблемы из-за значения по умолчанию для подписанного байта Java.
Мне нужно в основном обработать старый формат изображения и преобразовать его в растровое изображение. Этот формат имеет цветовую палитру в качестве справочной таблицы, и само изображение ссылается на эту палитру.
Это мой код:
const val WIDTH = 320
const val HEIGHT = 138
const val BPP = 8
class FileReader(path: String) {
private val file: File = File(path)
private val byteReader = DataInputStream(file.inputStream())
private val palette = Array<RGBPixel>(256) { i -> RGBPixel() }
private var rawPixels: ByteArray = ByteArray(WIDTH * HEIGHT)
private var realPixels: Array<Array<RGBPixel>> = Array(WIDTH) {
Array(HEIGHT) {
RGBPixel()
}
}
init {
val fileSize = file.length()
val paletteSize = 256 * 3
val skip = (WIDTH * HEIGHT + paletteSize)
byteReader.skip(fileSize - skip)
readPalette()
readPixels()
}
private fun readPixels() {
rawPixels = byteReader.readNBytes(WIDTH * HEIGHT)
for (i in 0 until WIDTH) {
for (j in 0 until HEIGHT) {
val pos = rawPixels[j * WIDTH + i]
realPixels[i][j] = palette[pos.toInt()]
}
}
}
private fun readPalette() {
for (i in 0 until 256) {
val color = RGBPixel()
color.r = byteReader.read()
color.g = byteReader.read()
color.b = byteReader.read()
palette[i] = color
}
}
//For JavaFX
fun toBitmap(): Image {
val img = WritableImage(WIDTH, HEIGHT)
val pw = img.pixelWriter
pw.setPixels(0, 0, WIDTH, HEIGHT, PixelFormat.getByteRgbInstance(), rawPixels, 0, WIDTH)
return img
}
}
Однако я получаю несколько ошибок из-за того, что rawpixels имеют отрицательные значения , Я думаю, это связано с тем, что Java интерпретирует байты в моем файле как подписанные, таким образом меняя значение от -127 до 128. Как я могу обойти это?
Я попытался суммировать 256 для каждого отрицательного значения, но я Интересно, будет ли более эффективное решение. Несмотря на это, у меня возникают проблемы с преобразованием изображения в моей функции toBitmap из-за того, что оно выходит за границы всего на 1, и я не могу понять, почему.