Самый простой и эффективный способ создания растрового изображения для циклов - PullRequest
0 голосов
/ 24 апреля 2019

Я застрял на этом некоторое время, в конце концов я сдался, но кто-нибудь может привести меня в правильном направлении.Также отметим, что в конечном результате должна быть альфа.

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 Ответ

1 голос
/ 24 апреля 2019
  1. Ваш вопрос неясен, так как вы не указали формат пикселей

    Так что же такое пиксельный формат 8/15/16/24/32 bpp? какой заказ rgab / bgra?

  2. почему const char?

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

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

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

  4. for(x...) петля имеет i внутри, что, скорее всего, является тиопо

  5. почему float каналы?

    , что только приводит к проблемам с кастингом ...

Так что, если я соберу все вместе, ваш код не будет работать вообще, как ожидалось. Чтобы исправить это и предположить, что остальная часть кода (визуализация) в порядке, а формат пикселя - 32bpp, я бы изменил ваш код следующим образом:

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

...