Форум программистов
 
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.
Внимание! Некоторое время письма не доходят до аккаунтов MAIL RU GROUP, не доходят на все почтовые ящики mail.ru, inbox.ru, bk.ru. Пишите им жалобы, чтобы быстрее восстановили получение писем, регистрируйтесь через яндекс почту и gmail, туда письма с активизацией доходят.

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

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

Ответ
 
Опции темы
Старый 26.12.2017, 16:27   #1
Aliens_wolfs
Участник клуба
 
Регистрация: 16.12.2009
Адрес: WWW ЛЕНИНГРАД СПб точка РУ
Сообщений: 860
Репутация: 435
По умолчанию Проблема с 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 Кб, 41 просмотров)

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

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

Последний раз редактировалось Pavia; 26.12.2017 в 17:05.
Pavia вне форума   Ответить с цитированием
Старый 26.12.2017, 17:27   #3
Aliens_wolfs
Участник клуба
 
Регистрация: 16.12.2009
Адрес: WWW ЛЕНИНГРАД СПб точка РУ
Сообщений: 860
Репутация: 435
По умолчанию

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

Код:

{------------------------------------------------------------------}
{  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, 20:05   #4
Aliens_wolfs
Участник клуба
 
Регистрация: 16.12.2009
Адрес: WWW ЛЕНИНГРАД СПб точка РУ
Сообщений: 860
Репутация: 435
По умолчанию

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

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

Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проблема с изображением Lolopop12 HTML и CSS 2 03.06.2017 03:31
Проблема с фоновым изображением в <body> Solak HTML и CSS 5 13.05.2017 19:07
Проблема с изображением mazzahaker C# (си шарп) 1 07.03.2013 10:03
Проблема связанная с изображением Fr. Железо 2 17.11.2011 17:46
Деление 8bit на 8bit без DIV Tronix Assembler 5 09.08.2010 20:54


07:59.


Powered by vBulletin® Version 3.8.8 Beta 2
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.

RusProfile.ru


Справочник российских юридических лиц и организаций.
Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru