Форум программистов
 
Расширенный поиск
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

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

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



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

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

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

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

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

Код:

{------------------------------------------------------------------}
{  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 ЛЕНИНГРАД СПб точка ру
Сообщений: 789
Репутация: 355
По умолчанию

Нашел ошибку вроде как заработало, оказалась в переменной)))
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




23:42.


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

купить трафик


как улучшить посещаемость, а также решения по монетизации сайтов, видео и приложений

RusProfile.ru


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