Как я могу конвертировать буфер 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];
}
}
но я не получаю цвет фона.
Пожалуйста, кто-нибудь поможет мне?
Это не C #, поэтому, пожалуйста, пометьте его соответствующим образом.
Предполагая, что это растровые данные, во-первых, вам нужно выяснить шагать изображения. Шаг — это количество байтов, которое использует каждая строка пикселей. Это не всегда равно 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.
Других решений пока нет …