Форум программистов, компьютерный форум, киберфорум
Delphi: Графика, звук, видео
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.67/6: Рейтинг темы: голосов - 6, средняя оценка - 4.67
0 / 0 / 0
Регистрация: 16.07.2019
Сообщений: 7
1

Чтение заголовка PCX файла и чтение растровых данных PCX файла

05.01.2020, 15:43. Просмотров 1146. Ответов 16
Метки нет (Все метки)

Привет форумчане!

Столкнулся с такой проблемой. Нужно считать заголовок PCX файла и растровые данные PCX файла. Код написал. Часть заголовка выводит правильно, остальная не сходится либо меняется при изменении картинки (может так и должно быть). Ещё не получается отобразить изображение на Image через OpenPictureDialog и выводит ошибку

Саму программу и скриншот ошибки прикладываю в отдельных файлах.

Делал все по методичке.

Код программы:

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
unit Unit1;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Menus, ExtDlgs, ExtCtrls, StdCtrls;
 
const
  PixelCountMax = 32768;
 
type
 
 pRGBArray = ^TRGBArray;
 TRGBArray = array[0..PixelCountMax - 1] of TRGBTriple;
 
 PCX=record
 Identifier:  Byte;
 Version:  Byte;
 Encoding: Byte;
 BitPerPixel:  Byte;
 Xstart:  Word;
 Ystart:   Word;
 Xend:  Word;
 Yend:   Word;
 HorizRez: Word;
 VertRez: Word;
 Palette:    array [0..48]  of Char;
 VideoMode:     Byte;
 NumBitPlanes:  Byte;
 BytesPerLine:   Word;
 PaletteType:  Word;
 HorizScrSize: Word;
 VertScrSize:  Word;
 Reserved2:  array [0..54]  of Char;
 
 end;
 
 
  TForm1 = class(TForm)
    mmo1: TMemo;
    img1: TImage;
    dlgOpen1: TOpenDialog;
    dlg1: TSavePictureDialog;
    mm1: TMainMenu;
    N1: TMenuItem;
    N2: TMenuItem;
    N3: TMenuItem;
    N4: TMenuItem;
    N5: TMenuItem;
    N6: TMenuItem;
    procedure N2Click(Sender: TObject);
 
    function invertword(val: Word): Word;
 
    procedure loadmemo();
 
 
 
 
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
var
  Form1: TForm1;
 
 
  bmp:TBitmap;
  Head: PCX;
 
implementation
 
{$R *.dfm}
 
procedure TForm1.N2Click(Sender: TObject);
var
  workpath: string;
  f1: file;
  Rhead: PCX;
  Row: pRGBArray;
  i,j: Integer;
begin
    workpath := ExtractFilePath(ParamStr(0));
     dlgOpen1.initialdir:= workpath + 'Images\';
     if dlgOpen1.execute
     then
     begin
     with Rhead do
     begin
       AssignFile(f1, dlgOpen1.Filename);
       Reset(f1,1);
       BlockRead(f1,Identifier, 1);
       Head.Identifier:= Identifier;
       if Identifier=10
       then
          begin
             BlockRead(f1,Version, 1);
                 Head.Version:=Version;
             BlockRead(f1,Encoding, 1);
                 Head.Encoding:=Encoding;
             BlockRead(f1,BitPerPixel, 1);
                 Head.BitPerPixel:=BitPerPixel;
             BlockRead(f1,Xstart, 2);
                 Head.Xstart:=invertword(Xstart);
             BlockRead(f1,Ystart, 2);
                 Head.Ystart:=invertword(Ystart);
             BlockRead(f1,Xend, 2);
                 Head.Xend:=invertword(Xend);
             BlockRead(f1,Yend, 2);
                 Head.Yend:=invertword(Yend);
             BlockRead(f1,HorizRez, 2);
                 Head.HorizRez:=invertword(HorizRez);
             BlockRead(f1,VertRez, 2);
                 Head.VertRez:=invertword(VertRez);
             BlockRead(f1,Palette, 48);
                 Head.Palette:=Palette;
             BlockRead(f1,VideoMode, 1);
                 Head.VideoMode:=VideoMode;
             BlockRead(f1,NumBitPlanes, 1);
                 Head.NumBitPlanes:=NumBitPlanes;
             BlockRead(f1,BytesPerLine, 2);
                 Head.BytesPerLine:=invertword(BytesPerLine);
             BlockRead(f1,PaletteType, 2);
                 Head.PaletteType:=invertword(PaletteType);
             BlockRead(f1,HorizScrSize, 2);
                 Head.HorizScrSize:=invertword(HorizScrSize);
             BlockRead(f1,VertScrSize, 1);
                 Head.VertScrSize:=invertword(VertScrSize);
             BlockRead(f1,Reserved2, 1);
                 Head.Reserved2:=Reserved2;
             loadmemo();
 
             bmp:=tbitmap.create;
             bmp.Width:=Head.Xstart;
             bmp.Width:=Head.Xend;
             bmp.Height:=Head.Ystart;
             bmp.Height:=Head.Yend;
 
             for j:= 0 to bmp.Height do
             begin
               Row := bmp.ScanLine[j];
               for i:= 0 to bmp.Width do
               begin
                 BlockRead(f1,Row[i].rgbtRed,1);
               end;
             end;
             end;
             end;
             for j:= 0 to bmp.Height do
             begin
               Row := bmp.ScanLine[j];
               for i:= 0 to bmp.Width  do
               begin
                 BlockRead(f1,Row[i].rgbtBlue,1);
               end;
             end;
             for j:= 0 to bmp.Height do
             begin
               Row := bmp.ScanLine[j];
               for i:= 0 to bmp.Width do
               begin
                 BlockRead(f1,Row[i].rgbtGreen,1);
               end;
             end;
 
               img1.Picture.Bitmap.Height:=bmp.Height;
               img1.Picture.Bitmap.Width:=bmp.Width;
 
               img1.Picture.Bitmap:=bmp;
 
             end ;
        //     else  MessageBox(0, 'Данный формат не соответствует формату PCX','Внимание') ;
             closefile(f1) ;
             end;
    function TForm1.invertword(val:Word): Word;
    begin
      invertword := ((val and $FF00) shr 8) or((val and $00FF) shl 8);
    end;
 
    procedure TForm1.loadmemo;
    begin
         mmo1.Lines.Clear;
         img1.Picture:=nil;
         with mmo1.Lines do
         begin
           with Head do
           begin
             Add('Изготовитель ' +inttostr(Identifier));
             Add('Версия ' +inttostr(Version));
             Add('Кодирование ' +inttostr(Encoding));
             Add('Битов на пиксель ' +inttostr(BitPerPixel));
             Add('Координаты изображения на экране ' +inttostr(Xstart));
             Add('Координаты изображения на экране ' +inttostr(Ystart));
             Add('Координаты изображения на экране ' +inttostr(Xend));
             Add('Координаты изображения на экране ' +inttostr(Yend));
             Add('Горизонтальный размер дисплея ' +inttostr(HorizRez));
             Add('Вертикальный размер дисплея ' +inttostr(VertRez));
             Add('16-цветная палитра ' +Palette) ;
             Add('Видеорежим ' +inttostr(VideoMode))  ;
             Add('Кол-во битовых плоскостей ' +inttostr(NumBitPlanes));
             Add('Байтов на строку развертки ' +inttostr(BytesPerLine)) ;
             Add('Тип палитры ' +inttostr(PaletteType)) ;
             Add('Горизонтальное разрешение сканера ' +inttostr(HorizScrSize));
             Add('Вертикальное разрешение сканера ' +inttostr(VertScrSize)) ;
             Add('Резерв ' +Reserved2);
           end;
         end;
    end;
 
    end.
0
Миниатюры
Чтение заголовка PCX файла и чтение растровых данных PCX файла  
Вложения
Тип файла: 7z PCX.7z (173.2 Кб, 2 просмотров)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
05.01.2020, 15:43
Ответы с готовыми решениями:

Чтение растровых данных PSD файла
Недавно я создал тему о чтении заголовка из PSD-файла. Теперь нужно считать растровые данные и...

Вывод на экран монитора графической картинки из файла формата PCX
Дорогие пользователи нужна ваша помощь, кто может проверить у себя эту программу, у меня не...

Чтение заголовка из файла
Здравствуйте, уважаемые программисты! Некоторое время назад тоже решил заняться изучением PHP....

Чтение заголовка PSD файла
Нужно считать заголовок PSD-файла. Написал такой код, в учебной методичке приведены значения,...

16
Продавец времени
4003 / 2277 / 513
Регистрация: 12.03.2015
Сообщений: 11,387
05.01.2020, 16:23 2
В архиве нет файла pcx. Зачем так?
0
0 / 0 / 0
Регистрация: 16.07.2019
Сообщений: 7
05.01.2020, 16:32  [ТС] 3
Оу. Совсем забыл
0
Вложения
Тип файла: 7z PCX файлы.7z (782.7 Кб, 3 просмотров)
Продавец времени
4003 / 2277 / 513
Регистрация: 12.03.2015
Сообщений: 11,387
05.01.2020, 16:52 4
Ошибка происходит при назначении размеров битмапа.
Из файла прочитаны совершенно конские для TBitmap значения.

Чтение заголовка PCX файла и чтение растровых данных PCX файла
2
0 / 0 / 0
Регистрация: 16.07.2019
Сообщений: 7
05.01.2020, 17:24  [ТС] 5
А как можно исправить эту ошибку?
С чего начать?
0
Продавец времени
4003 / 2277 / 513
Регистрация: 12.03.2015
Сообщений: 11,387
05.01.2020, 17:28 6
Цитата Сообщение от GodMars Посмотреть сообщение
А как можно исправить эту ошибку?
руками.
Цитата Сообщение от GodMars Посмотреть сообщение
С чего начать?
Дай методичку мне.
0
Продавец времени
4003 / 2277 / 513
Регистрация: 12.03.2015
Сообщений: 11,387
05.01.2020, 18:15 7
Немного допилил начало.

Чтение заголовка PCX файла и чтение растровых данных PCX файла


Поскольку методичку не даёшь, дальше сам ковыряй.
Я потерял интерес к твоей теме. Тут кинцо хорошее по зомбоящику началось.
Инфу тут брал.
0
Вложения
Тип файла: 7z PCX.7z (1.42 Мб, 2 просмотров)
0 / 0 / 0
Регистрация: 16.07.2019
Сообщений: 7
05.01.2020, 18:23  [ТС] 8
Вот метода
Вкладка включена была, а сам отошел
0
Вложения
Тип файла: pdf Delphi4.pdf (823.9 Кб, 5 просмотров)
Продавец времени
4003 / 2277 / 513
Регистрация: 12.03.2015
Сообщений: 11,387
05.01.2020, 18:27 9
Цитата Сообщение от GodMars Посмотреть сообщение
Вот метода
Вкладка включена была, а сам отошел
Я уже комп выключил.
0
Продавец времени
4003 / 2277 / 513
Регистрация: 12.03.2015
Сообщений: 11,387
05.01.2020, 18:33 10
Ты где взял эту методичку?

Чтение заголовка PCX файла и чтение растровых данных PCX файла


Прикол хошь? Я заканчивал именно эту кафедру. Правда, на 9 лет раньше, чем был создан этот документ.
0
0 / 0 / 0
Регистрация: 16.07.2019
Сообщений: 7
05.01.2020, 18:40  [ТС] 11
Делаю знакомым лабу. Вот скинули методу
0
1799 / 852 / 303
Регистрация: 15.11.2015
Сообщений: 3,356
05.01.2020, 21:49 12
Байты в PCX не надо переворачивать. Сразу прочитать весь заголовок и потом смотреть поля:
Delphi
1
BlockRead(f1, Rhead, 128);
И поля Palette и Reserved2 надо начинать с 1 или верхний индекс уменьшить на 1.
0
0 / 0 / 0
Регистрация: 16.07.2019
Сообщений: 7
05.01.2020, 22:45  [ТС] 13
Насчет полей Palette и Reserved2 я лоханулся знатно.
Убрал функцию invertword и стал правильно показывать данные в заголовке, кроме данных 16-цветная палитра, Вертикальное разрешение сканера (должно стоять значение 0) и Резерв.
Скрин прикладываю.
Но проблема остается до сих пор с выводом изображения на Image и выдает ошибку.
0
Миниатюры
Чтение заголовка PCX файла и чтение растровых данных PCX файла  
Продавец времени
4003 / 2277 / 513
Регистрация: 12.03.2015
Сообщений: 11,387
05.01.2020, 22:53 14
Цитата Сообщение от GodMars Посмотреть сообщение
Но проблема остается до сих пор с выводом изображения на Image и выдает ошибку.
Так и будет продолжаться, пока ты не начнёшь учитывать сжатие.
0
0 / 0 / 0
Регистрация: 16.07.2019
Сообщений: 7
05.01.2020, 22:54  [ТС] 15
Цитата Сообщение от GodMars Посмотреть сообщение
Вертикальное разрешение сканера (должно стоять значение 0)
Исправил (слепой).
Остается проблема с 16-цветная палитра и Резерв (либо пусто, либо пишет бред), и не выводит изображение.
0
1799 / 852 / 303
Регистрация: 15.11.2015
Сообщений: 3,356
05.01.2020, 23:06 16
Цитата Сообщение от GodMars Посмотреть сообщение
Остается проблема с 16-цветная палитра
А что с ним не так? Если 16 цветов, то палитра в заголовке, если 256 цветов, то палитра в конце файла после пикселей.
0
krapotkin
07.01.2020, 16:53     Чтение заголовка PCX файла и чтение растровых данных PCX файла
  #17

Не по теме:

капец.
я эту тему в 2020 могу рассматривать только как практикум по работе с промышленными протоколами
но точно не "обработка изображений"...

0
07.01.2020, 16:53
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.01.2020, 16:53
Привет! Вот еще темы с ответами:

Чтение заголовка bmp файла
Написать программу, которая позволяет ввести имя bmp-файла, считать его заголовки и вывести на...

Чтение файла, чтение названия папки где находится файл, запись данных на PHP
Допустим у нас есть структура с папками типа Large -> Vehicles -> Firetruck_0 В этой папке лежит...

Открытие wav файла и чтение его заголовка
Надо открыть wav файл и прочитать заголовок его , компилиться но ничего не происходит #include...

Преобразовать 256-цветный PCX файл в 16-цветный PCX файл
Всем здравствуйте! Пожалуйста, кто может реализовать данную программку-конвертор. Для уменьшения...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.