не выровненное по двойному изображению растровое изображение

Я должен преобразовать необработанные данные пикселей (строки * столбцы = 479 * 638), которые не выровнены по DWORD, по данным, выровненным по DWORD. У меня мало сомнений.

1) Когда я говорю, что слово выровнено, речь идет о распределении общей памяти, которая выровнена по слову, или о выравнивании ширины DWORD?

2) Скажем, если речь идет о фактической ширине при выравнивании DWORD, то из-за выравнивания DWORD я добавляю дополнительные 2 байта в конце, чтобы сделать ширину = 640. Но когда я делаю мемкопию от источника к месту назначения, он оставляет темно-черный линия внизу. Но я не хочу эти темные линии, потому что это создает путаницу из реального изображения. Так как же мне избежать этой черной линии в конце?

Чтобы решить эту проблему, я предположил, что это примерно общая выделенная память, которая выровнена по dword. И я выделил столько памяти, выровненной мечом.

bitmapData = (LPBYTE) GlobalAlloc(GMEM_FIXED, bmiHeader->biSizeImage);

куда bmiHeader->biSizeImage = nrows * dowrdalignedwidth * BPP.

Делая настоящую мемкопию, я копирую и пишу rows*cols*BPP, Это правильно?

0

Решение

Выравнивание DWORD для изображений обычно для шага, то есть ширины, и выражается в байтах, а не в пикселях.
Прямо сейчас вы меняете количество пикселей, которое должно быть кратным 4, но это увеличит ваше общее число байтов в строке намного больше, чем необходимо, фактически, вероятно, на 8 байтов.

Что вы делаете, это вычислить (столбцы * биты на пиксель), а затем выровняйте это по 32 битам, чтобы получить ваш шаг или ширину.
Затем вы можете умножить это на высоту, чтобы получить полный размер изображения.

Таким образом, для вашего изображения, которое составляет 479 * 638, 638 — это столбцы и, следовательно, ширина.
Если ваше изображение составляет 4 байта на пиксель, вам не нужно делать ничего особенного, потому что DWORD составляет 4 байта, поэтому ваша общая ширина в байтах кратна 4 байтам или 32 битам, 638 * 4 = 2552. Так что просто умножьте это по высоте, чтобы получить ваш общий размер изображения в байтах.

Однако, если ваше изображение было 3 байта на пиксель, то 638 ​​* 3 = 1914, а 1914 не кратен 4.
Таким образом, вам нужно заполнить 1914 байтов до следующего кратного 4.

Я обычно делаю это в C #, поэтому формула, которую я использую:

((Ширина & bitsPerPixel) + 31) & ~ 31

Затем разделите результат на 8, чтобы получить его в виде байтов, а не битов, если это необходимо.

Так что в вашем случае, если вы сделаете (638 * 24) / 8, чтобы получить 1914 байт, что не является выровненным значением DWORD, но, используя приведенную выше формулу, вы получите 1916, который является кратным 4 байтам и является правильным значением для вашего шага. ,

1

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector