Чтение неподписанных байтов с InputStream - PullRequest
0 голосов
/ 01 мая 2020

Я пытаюсь прочитать двоичный файл, используя 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, и я не могу понять, почему.

...