Работа с палитрой на примерах |
Добро пожаловать, гость ( Вход | Регистрация )
Работа с палитрой на примерах |
Siberian GRemlin |
Jun 16 2007, 04:51
Сообщение
#1
|
Advanced Member Группа: CTPAX-X Сообщений: 537 Регистрация: 4-February 08 Пользователь №: 2 Спасибо сказали: 221 раз(а) |
Уважаемые, объясните что к чему. Вроде, всё правильно делаю, а изображение похоже с косяками.
http://slil.ru/24516685 - исходник + примеры из игры Earth 2140 |
-=CHE@TER=- |
Jun 16 2007, 22:13
Сообщение
#2
|
Walter Sullivan Группа: Root Admin Сообщений: 1,361 Регистрация: 4-February 08 Пользователь №: 3 Спасибо сказали: 314 раз(а) |
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 Заменить на (RGB, минус один Begin/End и, помимо всего прочего, убрал вычитание единиц на каждом шаге):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; 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. |
Siberian GRemlin |
Jun 17 2007, 03:53
Сообщение
#3
|
Advanced Member Группа: CTPAX-X Сообщений: 537 Регистрация: 4-February 08 Пользователь №: 2 Спасибо сказали: 221 раз(а) |
Спасиба!
|
Упрощённая версия | Сейчас: 10th November 2024 - 18:16 |