Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Мультимедиа в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 26.12.2017, 15:27   #1
Aliens_wolfs
Форумчанин
 
Регистрация: 16.12.2009
Сообщений: 902
По умолчанию Проблема с 8bit изображением

Добрый день форумчане!
Есть код который открывает bmp файл и отображает изображение в OpenGL, с 24bit изображение хорошо отображается, а вот с 8bit не может корректно загрузить палитру, системную тоже пробовал из интернета примеры нашел но тоже цвета кривые. В чем может быть причина, голову ломаю уже второй день в интернете пересмотрел много примеров но что то не могу сообразить. Я так понимаю что принцип обработки палитрой неправильный. За ранее спасибо.
Код:
procedure LoadBitmap(Filename: String; out Width, Height, Format: Word; out pData: PByteArray);
var
  FileHeader: TBITMAPFILEHEADER;
  InfoHeader: TBITMAPINFOHEADER;
  Palette: array of TRGBTriple;
  F: File;
  BitmapLength: LongWord;
  PaletteLen: integer;
  ReadBytes: LongWord;
  Data: array of byte;
  i: integer;
begin

    if not file_Exists(PChar(Filename)) then
  begin
    log_Add('Error file_Exists "' + Filename + '"');
    Exit;
  end;
  AssignFile(F, FileName);
  {$I-}
   FileMode := $0000;
   Reset(F, 1);
   {$I+}
   if IOResult <> 0 then
     begin
    log_Add('Error "' + Filename + '"');
    Exit;
  end;

  if (TFileRec(F).Handle = INVALID_HANDLE_VALUE) then
  begin
    log_Add('Error "' + Filename + '"');
    Exit;
  end;

  //Извлекаем информацию изображения
  BlockRead(F, FileHeader, SizeOf(FileHeader), ReadBytes);
  BlockRead(F, InfoHeader, SizeOf(InfoHeader), ReadBytes);

    // Извлекаем палитру 8bit
  if InfoHeader.biBitCount = 8 then
   PaletteLen:= 768
   else
   PaletteLen:= InfoHeader.biClrUsed;

  if PaletteLen > 0 then
  begin
  SetLength(Palette, PaletteLen);
  BlockRead(f, Pointer(Palette)^, PaletteLen, ReadBytes);
  if (ReadBytes <> PaletteLen) then
   begin
    log_Add('Error reading palette');
    Exit;
  end;
  end;

  Width := InfoHeader.biWidth;
  Height := InfoHeader.biHeight;
  BitmapLength := InfoHeader.biSizeImage;
  if BitmapLength = 0 then
    BitmapLength := Width * Height * InfoHeader.biBitCount Div 8;


  //Извлекаем изображение
  SetLength(Data, BitmapLength);
  seek(f, FileHeader.bfOffBits);
  BlockRead(f, Pointer(Data)^, BitmapLength, ReadBytes);
  if (ReadBytes <> BitmapLength) then
  begin
    log_Add('Error reading bitmap data');
    Exit;
  end;
  CloseFile(f);

 GetMem(pData, Width * Height * 4);
 FillChar(pData^, Width * Height * 4, 0);

//Если 24bit то
 if InfoHeader.biBitCount = 24 then
 begin
 for i := 0 to Width * Height - 1 do
    begin
          PData^[i * 4 + 2] := Data[ 0 ];
          PData^[i * 4 + 1] := Data[ 1 ];
          PData^[i * 4] := Data[ 2 ];
          PData^[i * 4 + 3] := 255;
          INC(PByte(Data), 3);
    end;
  end
  else
//Если 8bit то
  if InfoHeader.biBitCount = 8 then
 //С использованием палитры
 for i := 0 to Width * Height - 1 do
  begin
 if Palette <> nil then
 begin
        PData[i * 4 + 2] := Palette[data[0]].rgbtBlue;
        PData[i * 4 + 1] := Palette[data[0]].rgbtGreen;
        PData[i * 4] := Palette[data[0]].rgbtRed;
        PData[i * 4 + 3] := 255;
        INC(PByte(Data));
    end
    else
   begin
//Без использования палитры
    begin
        PData[i * 4 + 2] := data[0];
        PData[i * 4 + 1] := data[0];
        PData[i * 4] := data[0];
        PData[i * 4 + 3] := 255;
  end;
        INC(PByte(Data));
    end;
 Format:= TEX_FORMAT_RGBA;
  SetLength(Data, 0);
  SetLength(Palette, 0);
end;
Скрин с изображением результатов
Изображения
Тип файла: jpg Изображение.jpg (97.3 Кб, 115 просмотров)

Последний раз редактировалось Aliens_wolfs; 26.12.2017 в 19:37.
Aliens_wolfs вне форума Ответить с цитированием
Старый 26.12.2017, 16:01   #2
Pavia
Лис
Старожил
 
Аватар для Pavia
 
Регистрация: 18.09.2015
Сообщений: 2,409
По умолчанию

Похоже что перепутан порядок байт BGR и RGB
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал .

Последний раз редактировалось Pavia; 26.12.2017 в 16:05.
Pavia вне форума Ответить с цитированием
Старый 26.12.2017, 16:27   #3
Aliens_wolfs
Форумчанин
 
Регистрация: 16.12.2009
Сообщений: 902
По умолчанию

Пробывал по разному цвета менять, все равно невыходит, еще пробовал вот эту функцию но тоже не то

Код:
{------------------------------------------------------------------}
{  Swap bitmap format from BGR to RGB                              }
{------------------------------------------------------------------}
procedure SwapRGB(data : Pointer; Size : Integer);
asm
  mov ebx, eax
  mov ecx, size

@@loop :
  mov al,[ebx+0]
  mov ah,[ebx+2]
  mov [ebx+2],al
  mov [ebx+0],ah
  add ebx,3
  dec ecx
  jnz @@loop
end;
Aliens_wolfs вне форума Ответить с цитированием
Старый 26.12.2017, 19:05   #4
Aliens_wolfs
Форумчанин
 
Регистрация: 16.12.2009
Сообщений: 902
По умолчанию

Нашел ошибку вроде как заработало, оказалась в переменной)))
Palette: array of TRGBTriple;
нужно вот так
Palette: array of RGBQUAD;

Последний раз редактировалось Aliens_wolfs; 26.12.2017 в 22:12.
Aliens_wolfs вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проблема с изображением Lolopop12 HTML и CSS 2 03.06.2017 02:31
Проблема с фоновым изображением в <body> Solak HTML и CSS 5 13.05.2017 18:07
Проблема с изображением mazzahaker C# (си шарп) 1 07.03.2013 10:03
Проблема связанная с изображением Fr. Компьютерное железо 2 17.11.2011 17:46
Деление 8bit на 8bit без DIV Tronix Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 5 09.08.2010 20:54