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

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

05.01.2020, 15:43. Показов 2788. Ответов 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.
Миниатюры
Чтение заголовка PCX файла и чтение растровых данных PCX файла  
Вложения
Тип файла: 7z PCX.7z (173.2 Кб, 6 просмотров)
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
05.01.2020, 15:43
Ответы с готовыми решениями:

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

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

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

16
Нарушитель
10227 / 5657 / 1258
Регистрация: 12.03.2015
Сообщений: 26,188
05.01.2020, 16:23
В архиве нет файла pcx. Зачем так?
0
0 / 0 / 0
Регистрация: 16.07.2019
Сообщений: 7
05.01.2020, 16:32  [ТС]
Оу. Совсем забыл
Вложения
Тип файла: 7z PCX файлы.7z (782.7 Кб, 13 просмотров)
0
Нарушитель
10227 / 5657 / 1258
Регистрация: 12.03.2015
Сообщений: 26,188
05.01.2020, 16:52
Ошибка происходит при назначении размеров битмапа.
Из файла прочитаны совершенно конские для TBitmap значения.

2
0 / 0 / 0
Регистрация: 16.07.2019
Сообщений: 7
05.01.2020, 17:24  [ТС]
А как можно исправить эту ошибку?
С чего начать?
0
Нарушитель
10227 / 5657 / 1258
Регистрация: 12.03.2015
Сообщений: 26,188
05.01.2020, 17:28
Цитата Сообщение от GodMars Посмотреть сообщение
А как можно исправить эту ошибку?
руками.
Цитата Сообщение от GodMars Посмотреть сообщение
С чего начать?
Дай методичку мне.
0
Нарушитель
10227 / 5657 / 1258
Регистрация: 12.03.2015
Сообщений: 26,188
05.01.2020, 18:15
Немного допилил начало.



Поскольку методичку не даёшь, дальше сам ковыряй.
Я потерял интерес к твоей теме. Тут кинцо хорошее по зомбоящику началось.
Инфу тут брал.
Вложения
Тип файла: 7z PCX.7z (1.42 Мб, 4 просмотров)
0
0 / 0 / 0
Регистрация: 16.07.2019
Сообщений: 7
05.01.2020, 18:23  [ТС]
Вот метода
Вкладка включена была, а сам отошел
Вложения
Тип файла: pdf Delphi4.pdf (823.9 Кб, 7 просмотров)
0
Нарушитель
10227 / 5657 / 1258
Регистрация: 12.03.2015
Сообщений: 26,188
05.01.2020, 18:27
Цитата Сообщение от GodMars Посмотреть сообщение
Вот метода
Вкладка включена была, а сам отошел
Я уже комп выключил.
0
Нарушитель
10227 / 5657 / 1258
Регистрация: 12.03.2015
Сообщений: 26,188
05.01.2020, 18:33
Ты где взял эту методичку?



Прикол хошь? Я заканчивал именно эту кафедру. Правда, на 9 лет раньше, чем был создан этот документ.
0
0 / 0 / 0
Регистрация: 16.07.2019
Сообщений: 7
05.01.2020, 18:40  [ТС]
Делаю знакомым лабу. Вот скинули методу
0
Модератор
4115 / 2347 / 807
Регистрация: 15.11.2015
Сообщений: 9,328
05.01.2020, 21:49
Байты в PCX не надо переворачивать. Сразу прочитать весь заголовок и потом смотреть поля:
Delphi
1
BlockRead(f1, Rhead, 128);
И поля Palette и Reserved2 надо начинать с 1 или верхний индекс уменьшить на 1.
0
0 / 0 / 0
Регистрация: 16.07.2019
Сообщений: 7
05.01.2020, 22:45  [ТС]
Насчет полей Palette и Reserved2 я лоханулся знатно.
Убрал функцию invertword и стал правильно показывать данные в заголовке, кроме данных 16-цветная палитра, Вертикальное разрешение сканера (должно стоять значение 0) и Резерв.
Скрин прикладываю.
Но проблема остается до сих пор с выводом изображения на Image и выдает ошибку.
Миниатюры
Чтение заголовка PCX файла и чтение растровых данных PCX файла  
0
Нарушитель
10227 / 5657 / 1258
Регистрация: 12.03.2015
Сообщений: 26,188
05.01.2020, 22:53
Цитата Сообщение от GodMars Посмотреть сообщение
Но проблема остается до сих пор с выводом изображения на Image и выдает ошибку.
Так и будет продолжаться, пока ты не начнёшь учитывать сжатие.
0
0 / 0 / 0
Регистрация: 16.07.2019
Сообщений: 7
05.01.2020, 22:54  [ТС]
Цитата Сообщение от GodMars Посмотреть сообщение
Вертикальное разрешение сканера (должно стоять значение 0)
Исправил (слепой).
Остается проблема с 16-цветная палитра и Резерв (либо пусто, либо пишет бред), и не выводит изображение.
0
Модератор
4115 / 2347 / 807
Регистрация: 15.11.2015
Сообщений: 9,328
05.01.2020, 23:06
Цитата Сообщение от GodMars Посмотреть сообщение
Остается проблема с 16-цветная палитра
А что с ним не так? Если 16 цветов, то палитра в заголовке, если 256 цветов, то палитра в конце файла после пикселей.
0
07.01.2020, 16:53

Не по теме:

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

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
07.01.2020, 16:53
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Новые блоги и статьи
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru