IPB

Добро пожаловать, гость ( Вход | Регистрация )

 
Reply to this topicStart new topic
> Работа с палитрой на примерах
Siberian GRemlin
Jun 16 2007, 04:51
Сообщение #1


Advanced Member
***

Группа: CTPAX-X
Сообщений: 533
Регистрация: 4-February 08
Пользователь №: 2
Спасибо сказали: 221 раз(а)



Уважаемые, объясните что к чему. Вроде, всё правильно делаю, а изображение похоже с косяками.
http://slil.ru/24516685 - исходник + примеры из игры Earth 2140
User is offlineProfile CardPM
Go to the top of the page
+Quote Post
-=CHE@TER=-
Jun 16 2007, 22:13
Сообщение #2


Walter Sullivan
***

Группа: Root Admin
Сообщений: 1,353
Регистрация: 4-February 08
Пользователь №: 3
Спасибо сказали: 311 раз(а)



Siberian GRemlin!
Ночью нужно спать. (*улыбается*)

Подсказываю, где ошибка:
QUOTE
Pallete: array[1..256] of record
R, G, B: byte;
end;

...

TempStream.ReadBuffer(b,1);
Image1.Canvas.Pixels[(j-1),(i-1)]:=((Pallete[b].R*$10000)+(Pallete[b].G*$100)+(Pallete[b].B));}

Байт-то у тебя от 0 до 255, а не от 1 до 256!

Переделал немного твою программу - теперь все картинки открываются нормально (BTW, чтобы не лезть каждый раз из жопы (ака "Мои документы") до нужных картинок, установи у OpenDialog1 свойство InitialDir в значение '.' (точка) - тогда будет начинать обзор с текущего каталога):

Кусок №1:
CODE
  Pallete: array[1..256] of record
    R, G, B: byte;
  end;
Заменить на:
CODE
  Pallete: array[0..255] of packed record
    R, G, B: byte;
  end;



Кусок №2:
CODE
    for i:=1 to 256 do begin
      TempStream.ReadBuffer(Pallete[i].R,1);
      TempStream.ReadBuffer(Pallete[i].G,1);
      TempStream.ReadBuffer(Pallete[i].B,1);
    end;
Заменить на:
CODE
    TempStream.ReadBuffer(Pallete[0], 256*3);



Кусок №3:
CODE
    for i:=1 to h do begin
      for j:=1 to w do begin
        TempStream.ReadBuffer(b,1);
        Image1.Canvas.Pixels[(j-1),(i-1)]:=((Pallete[b].R*$10000)+(Pallete[b].G*$100)+(Pallete[b].B));
      end;
    end;
Заменить на (RGB, минус один Begin/End и, помимо всего прочего, убрал вычитание единиц на каждом шаге):
CODE
    for i:=0 to h-1 do
      for j:=0 to w-1 do begin
        TempStream.ReadBuffer(b,1);
        Image1.Canvas.Pixels[j,i]:=RGB(Pallete[b].R, Pallete[b].G, Pallete[b].B);
      end;



Ещё добавь после этих строк:
CODE
    Image1.Width:=w;
    Image1.Height:=h;
Вот такие:
CODE
    Image1.Picture.Bitmap.Width:=Image1.Width;
    Image1.Picture.Bitmap.Height:=Image1.Height;

Иначе при попытке открыть сначала "files\piro\SHCKV00.DAT", а потом "files\DATAB.DAT", последний будет у тебя отображаться в маленьком, урезанном окошечке.


И ещё - товарищ Xplorer уже обращал внимание на эту ошибку:
CODE
    Insert('.PAL',pal,Length(pal)-3);
    Delete(pal,Length(pal)-3,4);
Заменить на:
CODE
    pal:=ChangeFileExt(pal, '.PAL');



А вообще - проще сразу с памятью работать, без Image'ов и конвертить эти файлы (.DAT+.PAL) в 256-ти цветовой .BMP.
User is offlineProfile CardPM
Go to the top of the page
+Quote Post
Siberian GRemlin
Jun 17 2007, 03:53
Сообщение #3


Advanced Member
***

Группа: CTPAX-X
Сообщений: 533
Регистрация: 4-February 08
Пользователь №: 2
Спасибо сказали: 221 раз(а)



Спасиба!
User is offlineProfile CardPM
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0 -

 



Упрощённая версия Сейчас: 28th March 2024 - 13:32