#c #algorithm #for-loop #bitmap #bitmapimage
#c #алгоритм #for-loop #растровое изображение #bitmapimage
Вопрос:
Я застрял на этом некоторое время, в конце концов я сдался, но кто-нибудь может направить меня в правильном направлении. Также обратите внимание, мне нужно, чтобы конечный результат имел альфа-версию.
static std::unique_ptr<unsigned char [ ]> ImageData;
if ( !ImageData) {
ImageData = std::make_unique<unsigned char [ ]>( Width* Height);
for ( int x = 0; i < Width; x ) {
for ( int y = 0; y < Height; y ) {
float Red = 128, Green = 128, Blue = 255, Alpha = 255;
// some cool math to determine color based off x/y.
// . . .
const unsigned char a[] = { Red, Green, Blue, Alpha };
*reinterpret_cast<unsigned char*>(ImageData.get() x y * Height) = *a;
};
};
};
Сгенерированное изображение является полностью мусорным и непригодным для использования, это просто случайное повреждение повсюду.
Комментарии:
1. Выражение
*a
равноa[0]
. То есть вы присваиваетеRed
значение только каждому байту в растровом изображении.2. Вам нужен массив
RGBQUAD
(если у вас нет заголовков Windows, создайте свою собственную структуру)
Ответ №1:
-
Ваш вопрос неясен, поскольку вы не указали формат пикселя
итак, что такое формат пикселей
8/15/16/24/32
bpp? в каком порядке rgab / bgra? -
почему
const char
?это не изменится с изменением положения!!! а также, как предложил
*a
какой-то чувак-программист, скопирует только первый,BYTE
поэтому остальные каналы не инициализированы, следовательно, вывод мусора. -
данные изображения
char
?это нормально, но тогда арифметика указателя 8-битная, а не 32-битная!!!
-
for(x...)
внутри цикла естьi
, скорее всего, thypo -
почему
float
каналы?это приводит только к проблемам с кастингом…
Итак, если я соберу все вместе, ваш код будет работать совсем не так, как ожидалось. Чтобы исправить это и предположить, что остальной код (визуализация) в порядке, а формат пикселей равен 32 бит / с, я бы изменил ваш код на это:
typedef unsigned char BYTE;
typedef unsigned __int32 DWORD;
static std::unique_ptr<unsigned char [ ]> ImageData;
const int _r=0; // here change the RGB/BGR order
const int _g=1;
const int _b=2;
const int _a=3;
if ( !ImageData)
{
ImageData = std::make_unique<unsigned char [ ]>( Width* Height*4);
int x,y,a;
BYTE db[4];
DWORD *dd=(DWORD*)(void*)db;
DWORD *p=reinterpret_cast<DWORD*>(ImageData.get());
for (a=0,y=0;y<Height;y )
for ( x=0;x<Width;x ,a )
{
// some cool math to determine color based on x,y.
db[_r]=x;
db[_g]=y;
db[_b]=x y;
db[_a]=128;
// copy pixel
p[a]=*dd;
}
}
Надеюсь, я правильно привел указатель, так как я не использую std::unique_ptr
. Также я закодировал его непосредственно в редакторе SO / SE, поэтому могут быть скрытые незначительные синтаксические ошибки или опечатки.