Самый простой и эффективный способ создания растрового изображения с использованием циклов For

#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:

  1. Ваш вопрос неясен, поскольку вы не указали формат пикселя

    итак, что такое формат пикселей 8/15/16/24/32 bpp? в каком порядке rgab / bgra?

  2. почему const char ?

    это не изменится с изменением положения!!! а также, как предложил *a какой-то чувак-программист, скопирует только первый, BYTE поэтому остальные каналы не инициализированы, следовательно, вывод мусора.

  3. данные изображения char ?

    это нормально, но тогда арифметика указателя 8-битная, а не 32-битная!!!

  4. for(x...) внутри цикла есть i , скорее всего, thypo

  5. почему 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, поэтому могут быть скрытые незначительные синтаксические ошибки или опечатки.