Автор: Siberian GRemlin Jun 16 2007, 04:51
Уважаемые, объясните что к чему. Вроде, всё правильно делаю, а изображение похоже с косяками.
http://slil.ru/24516685 - исходник + примеры из игры Earth 2140
Автор: -=CHE@TER=- Jun 16 2007, 22:13
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.