Передача вектора C ++ в файл писателя - PullRequest
0 голосов
/ 19 июня 2019

Я перевожу программу C ++ на Java. Там есть кусок кода, который записывает файл BMP. И я не могу понять fwrite(&outPixels[0], infoHeader.biSizeImage, 1, file); строку. Как записать весь BMP-файл, если он принимает только 0-й элемент вектора (эта строка не в цикле)?

typedef std::array<uint8, 3> TPixelBGRU8;

std::vector<TPixelBGRU8> outPixels;
outPixels.resize(c_numPixels);

for (size_t i = 0; i < c_numPixels; ++i) {
    const TPixelRGBF32& src = g_pixels[i];
    TPixelBGRU8& dest = outPixels[i];

    dest[0] = uint8(Clamp(correctedPixel[2] * 255.0f, 0.0f, 255.0f));
    dest[1] = uint8(Clamp(correctedPixel[1] * 255.0f, 0.0f, 255.0f));
    dest[2] = uint8(Clamp(correctedPixel[0] * 255.0f, 0.0f, 255.0f));
}

//
// setting a header info
//

FILE *file;
fopen_s(&file, fileName, "wb");
fwrite(&outPixels[0], infoHeader.biSizeImage, 1, file);

Вот что я сделал:

// Vector is my own class like array<uint8, 3>
List<Vector> outPixel = new ArrayList<>(numPixels);

for (int i = 0; i < numPixels; i++) {
    Vector src = pixels.get(i);
    Vector dest = outPixel.get(i);

    dest.setX((int) clamp(correctedPixel.getZ() * 255.0, 0.0, 255.0));
    dest.setY((int) clamp(correctedPixel.getY() * 255.0, 0.0, 255.0));
    dest.setZ((int) clamp(correctedPixel.getX() * 255.0, 0.0, 255.0));
}

BufferedImage img = new BufferedImage(imageWidth, imageHeight, 
                             BufferedImage.TYPE_INT_BGR);

// I suppose I did it wrong:
for (int i = 0; i < imageWidth; i++) {
    for (int j = 0; j < imageHeight; j++) {
        img.setRGB(i, j, (int) outPixel.get(i * j));
    }
}

1 Ответ

2 голосов
/ 19 июня 2019

&outPixels[0] - это худший способ сказать outPixels.data(). Это указатель на содержимое буфера vector.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...