Как конвертировать буфер BGRA в формат буфера RGBA?

-7

Как я могу конвертировать буфер BGRA в формат буфера RGBA в C++

void ConvertBetweenBGRAandRGBA(unsigned char* input, int pixel_width,int pixel_hight,
unsigned char* output) {

for (int y = 0; y < pixel_hight; y++) {
for (int x = 0; x < pixel_width; x++) {
const unsigned char* pixel_in = &input[y * x * 4];

unsigned char* pixel_out = &output[y * x * 4];
pixel_out[0] = pixel_in[2];
pixel_out[1] = pixel_in[1];
pixel_out[2] = pixel_in[0];
pixel_out[3] = pixel_in[3];
}
}

но я не получаю цвет фона.

PLS, кто-нибудь мне помогает?

спросил(а) 2012-11-16T22:27:00+04:00 8 лет назад
0
100

Это не С#, поэтому, пожалуйста, перемаркируйте его соответствующим образом.

Предполагая, что это данные в растровых изображениях, во-первых, вам нужно выяснить шаг изображения. Шаг - это количество байтов, которое использует каждая строка пикселей. Это не всегда равно bytes_per_pixel * pixels_per_row. Он обычно выравнивается до четырех байтов, поэтому в этом случае (поскольку пиксели ARGB используют четыре байта на пиксель), вы должны быть в порядке.

Во-вторых, ваша формула для получения адреса пикселя (x, y) неверна. Пиксели хранятся в строчном порядке. Это означает, что, начиная со смещения 0 в пиксельном буфере, вы увидите одну полную строку данных пикселя; а затем еще одну полную строку; и так далее. Там полный шаг байтов для каждой строки пиксельных данных.

Вы можете сделать это:

const unsigned char* pixel_in = &input[((y * pixel_width) + x) * 4];

Но если ваш шаг действительно равен ширине изображения, вам не нужно каждый раз вычислять адрес, потому что пиксели будут сохраняться последовательно:

void ConvertBetweenBGRAandRGBA(unsigned char* input, int pixel_width,
int pixel_height, unsigned char* output)
{
int offset = 0;

for (int y = 0; y < pixel_height; y++) {
for (int x = 0; x < pixel_width; x++) {
output[offset] = input[offset + 2];
output[offset + 1] = input[offset + 1];
output[offset + 2] = input[offset];
output[offset + 3] = input[offset + 3];

offset += 4;
}
}
}

Если он все еще не отображается правильно, подтвердите правильность упаковки пикселей. Это должно быть ARGB или BGRA; Я никогда не слышал о пикселях, упакованных как RGBA.

ответил(а) 2012-11-16T22:43:00+04:00 8 лет назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема