imho.ws
IMHO.WS  

Вернуться   IMHO.WS > Компьютеры > Программирование
Опции темы
Старый 18.01.2004, 15:15     # 1
makkintosh
Guest
 
Сообщения: n/a

pascal & 256c bmps = troubles

Здр.
мне на форуме кто-то прислал код проги которая воспроизводит 256 цветные БМП файлы.
И прислали картинку в качестве примера. Отлично. там был нарисован г-н Хитман.
:-) Не в этом дело.

Когда я пытаюсь воспроизвести другой файл получаю ошибку времени выполнения 100 или 100 в паскале (DISK READ ERR)

в чем прикол? ни одну другую бмпшку я не смог воспроизвести.

выкладываю код этой проги. и результаты работы с файлом из примера и моим.

Прога:
Цитата:
{Author Andrey Vinogradov}
uses crt;
Type BmpHeader = Record
bfType : word; {BM}
bfSize : longint; {размер файла}
bfReserved1 : word;
bfReserved2 : word;
bfOffbits : longint; {смещение до начала массива пикселов}
biSize : longint;
biWidth : longint;
biHeight : longint;
biPlanes : word; {число битовых плоскостей}
biBitCount : word; {число бит на пиксел}
biCompression : longint;
biSizeImage : longint;
biXPelsPerMeter : longint;
biYPelsPerMeter : longint;
biClrUsed : longint;
biClrImportant : longint;
end;

rgb = record
b:byte;
g:byte;
r:byte;
end;

var k,x0,y0,i,j,he,wi:word;
scr: array [0..64000] of byte absolute $A000: $0000;
BM:string[20];
f:file of BmpHeader;
h:BmpHeader;
f1,f2:file of byte;
c: array [1..256] of rgb;
bmp:array[1..198,1..320] of byte;
l:byte;
error:boolean;

procedure init; Assembler;
asm
mov ah,0
mov al,19
int 16
end;

procedure initb; Assembler;
asm
mov ah,0
mov al,$3
int 16
end;

Procedure Palette(N,R,G,B:byte);
begin
port[$3c8]:=N;
port[$3c9]:=R;
port[$3c9]:=G;
port[$3c9]:=B;
end;

procedure put(x,y:integer;c:byte);
begin
if (0<=x)and(x<=319)and(0<=y)and(y<=199) then
scr[y*320+x]:=c;
end;

begin
if paramcount=0 then begin
writeln('Use: bmp_view <file name.bmp>');
Halt(1);
end;
BM:=paramstr(1);
assign(f,bm);
reset(f);
read(f,h);
clrscr;
error:=false;
with h do begin

if bfType=19778 then writeln('BMP файл: ',BM)
else begin writeln('Ошибка: Это не BMP файл.'); error:=true; end;
writeln('Размер файла: ',bfSize);
writeln('Ширина картинки: ',biWidth);
writeln('Высота картинки: ',biHeight);
writeln('Число битовых плоскостей: ',biPlanes);
if biPlanes<>1 then begin
writeln('Ошибка: Не поддерживается больше 1 битовой плоскости.');
error:=true; end;
writeln('Число бит на пиксел: ',biBitCount);
if h.biBitCount<>8 then begin
writeln('Ошибка: Не поддерживается больше 8 бит на пиксел.');
error:=true; end;
write('Комперссия: ',biCompression);
if biCompression=0 then writeln(' (нет)')
else begin writeln(' (есть)');
writeln('Ошибка: Не поддерживается комперссия.');
error:=true; end;
writeln('Количество пикселов в картинке: ',biSizeImage);
writeln('Пикселов на метр по X: ',biXPelsPerMeter);
writeln('Пикселов на метр по Y: ',biYPelsPerMeter);
writeln('Используется цветов в палитре: ',biClrUsed);
if biClrUsed>256 then begin
writeln('Ошибка: Не поддерживается больше, чем 256 цветов.');
error:=true; end;
end;

readkey;
if error then exit;
{/////////////READ IMAGE/////////////////}
assign(f2,BM);
reset(f2);
seek(f2,filesize(f2)-h.biSizeImage);

if h.biHeight>198 then he:=198
else he:=h.biHeight;
if h.biwidth>320 then wi:=320
else wi:=h.biwidth;

for i:=h.biHeight downto 1 do
for j:=1 to h.biwidth do
begin
read(f2,l);
if (i<=he)and(j<=wi) then bmp[i,j]:=l;
end;
{/////////////SET PALETTE////////////////}
assign(f1,BM);
reset(f1);
seek(f1,sizeof(h));
for k:=0 to h.biClrUsed-1 do
begin
read(f1,c[k].b);
read(f1,c[k].g);
read(f1,c[k].r);
read(f1,l);
end;

init;
port[$3c6]:=255; {for palette}
palette(0,0,0,0);{for black color}
for i:=1 to h.biClrUsed-1 do
palette(i,c[i].r shr 2,c[i].g shr 2,c[i].b shr 2);

{/////////////SHOW IMAGE/////////////////}
x0:=(320-wi) div 2;
y0:=(200-he) div 2;
for i:=he downto 1 do
for j:=1 to wi do begin
put(j+x0,i+y0,bmp[i,j]);
end;

readkey;
initb;
writeln('www.andrey999.nm.ru');
writeln('Mail or what? andrey999.ua.fm');
end.
результат с хитманом

Цитата:
BMP файл: c:\4.bmp
Размер файла: 65078
Ширина картинки: 320
Высота картинки: 200
Число битовых плоскостей: 1
Число бит на пиксел: 8
Комперссия: 0 (нет)
Количество пикселов в картинке: 64000
Пикселов на метр по X: 0
Пикселов на метр по Y: 0
Используется цветов в палитре: 256

пример с моим файлом

Цитата:
BMP файл: alex256.bmp
Размер файла: 65078
Ширина картинки: 320
Высота картинки: 200
Число битовых плоскостей: 1
Число бит на пиксел: 8
Комперссия: 0 (нет)
Количество пикселов в картинке: 64000
Пикселов на метр по X: 3780
Пикселов на метр по Y: 3780
Используется цветов в палитре: 0
Runtime error 100 at 0000:07BC.

что такое

Пикселов на метр по X: 3780
Пикселов на метр по Y: 3780

??? и почему там DISK READ ERROR???
 
Старый 18.01.2004, 17:31     # 2
dr-evil
::VIP::
 
Аватар для dr-evil
 
Регистрация: 17.02.2002
Адрес: /home/dr-evil
Пол: Male
Сообщения: 2 212

dr-evil Сэнсэйdr-evil Сэнсэйdr-evil Сэнсэйdr-evil Сэнсэйdr-evil Сэнсэйdr-evil Сэнсэйdr-evil Сэнсэйdr-evil Сэнсэйdr-evil Сэнсэйdr-evil Сэнсэйdr-evil Сэнсэйdr-evil Сэнсэйdr-evil Сэнсэй
если мне не изменяет память, то формат бмп чуть изменился.... короче стал другим.... думаю надо почитать описания - и соответственно изменить код.
__________________
Сеть - это диагноз... а сисадмин - состояние души.
Питер! Все на сходку!!! | Обзоры порталов. Добавь свою любимую систему!
dr-evil вне форума  
Старый 19.01.2004, 18:31     # 3
makkintosh
Guest
 
Сообщения: n/a

где можно достать подобные описания???
 


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

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

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


Часовой пояс GMT +4, время: 08:06.




Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.