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

Чтение заголовка PSD файла

15.12.2019, 22:45. Показов 3779. Ответов 8

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

Код:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
type
  _Reserved = array[0..5] of byte;
  PPSDHeader = ^TPSDHeader;
  TPSDHeader = packed record
    Signature1      :longword;
    Version           :word;
    Reserved        :_Reserved;
    Channels        :word;
    Rows              :integer;
    Colomns         :integer;
    Depth             :word;
    Mode              :word;
end;
Потом вывожу через лист:
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
var
  f:longword;
  b:byte;
  __Reserved,i:integer;
  TPSD:TPSDHeader;
begin
    f:=FileOpen(FileName, fmsharedenynone or fmopenread);
    FileRead(f, TPSD, sizeof(TPSDHeader));
    Info.Add('Name : ' + ExtractFileName(FileName));
    __Reserved:=0;
    for I := 0 to 5 do    //Вывод числа из массива Reserved
    begin
      __Reserved:= __Reserved + TPSD.Reserved[i];
      if i<>5 then
        __Reserved:=__Reserved*10
    end;
    Info.Add('Signature : ' + IntToStr(TPSD.Signature1));
    Info.Add('Version : ' + IntToStr(TPSD.Version));
    Info.Add('Reserved : ' + IntToStr(__Reserved));
    Info.Add('Channels : ' + IntToStr(TPSD.Channels));
    Info.Add('Rows : ' + IntToStr(TPSD.Rows));
    Info.Add('Colomns : ' + IntToStr(TPSD.Colomns));
    Info.Add('Depth : ' + IntToStr(TPSD.Depth));
    Info.Add('Mode : ' + IntToStr(TPSD.Mode));
end;
Размеры полей соблюдены верно, заголовок должен быть равен 26(т.е. верно). Но значения выводятся неверные(к примеру Colomns и Rows показывают странные значения пикселей). Кто-нибудь имел дело с PSD-header, можете ли как-нибудь навести на верный путь. Заранее спасибо.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
15.12.2019, 22:45
Ответы с готовыми решениями:

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

Чтение заголовка PCX файла и чтение растровых данных PCX файла
Привет форумчане! Столкнулся с такой проблемой. Нужно считать заголовок PCX файла и растровые данные PCX файла. Код написал. Часть...

Чтение заголовка из внешнего файла формата TGA grayscale (TGAgs)
Подскажите как можно считать заголовок из внешнего файла формата TGA grayscale (TGAgs или Targa grayscale). А именно IDLength,...

8
Модератор
4141 / 2353 / 811
Регистрация: 15.11.2015
Сообщений: 9,409
16.12.2019, 13:27
Лучший ответ Сообщение было отмечено a_dude как решение

Решение

Цитата Сообщение от a_dude Посмотреть сообщение
Но значения выводятся неверные
Предположу, что в PSD иной порядок байтов и в полях из 2 или 4 байт нужно поменять местами 0 и 3, и 1 и 2 байты.
2
0 / 0 / 0
Регистрация: 25.04.2019
Сообщений: 33
16.12.2019, 17:32  [ТС]
AzAtom, вы оказались почти правы. Сейчас значения стали действительно внятными. Только вот что осталось непонятным:
Я не переворачиваю слова, но значения выводятся(вроде) верные. А вот инты и переворачиваю, и не переворачиваю, все-равно неверно: columns и rows дают неверные значения(проверил в фотошопе).
0
пофигист широкого профиля
4769 / 3204 / 862
Регистрация: 15.07.2013
Сообщений: 18,611
16.12.2019, 18:44
Цитата Сообщение от a_dude Посмотреть сообщение
А вот инты и переворачиваю
Как именно переворачиваете?
0
0 / 0 / 0
Регистрация: 25.04.2019
Сообщений: 33
16.12.2019, 18:50  [ТС]
Сначала делаю массив:
Delphi
1
_integer = array[0..3] of byte;
Потом, как в первом сообщении,но заместо «integer» пишу «_integer»,т.е массив
После переворачиваю:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
function TForm1.reInteger(int: _integer):integer;
var
  i:integer;
  ans:integer;
  rI:_integer;
begin
  ans:=0;
  for I := 0 to 3 do
    rI[i]:=int[3-i];
  for I := 0 to 3 do
  begin
    if I<>3 then
      ans:=ans+rI[i]*10
    else
      ans:=ans+rI[i]
  end;
  result:=ans;
end;
Домножаю для того, чтобы сделалось число цельное.
0
пофигист широкого профиля
4769 / 3204 / 862
Регистрация: 15.07.2013
Сообщений: 18,611
16.12.2019, 19:02
Лучший ответ Сообщение было отмечено a_dude как решение

Решение

А если так:
Delphi
1
2
3
4
5
6
7
8
9
10
function TForm1.reInteger(int: _integer):integer;
var
  i:integer;
  rI:_integer;
  ans : integer absolute rI;
begin
  for I := 0 to 3 do
    rI[i]:=int[3-i];
  result:=ans;
end;
1
0 / 0 / 0
Регистрация: 25.04.2019
Сообщений: 33
16.12.2019, 19:43  [ТС]
Вау, действительно, сейчас верно. Даже и не знал что такое есть.
Спасибо большое!
0
Модератор
4141 / 2353 / 811
Регистрация: 15.11.2015
Сообщений: 9,409
16.12.2019, 20:42
Я меняю байты по другому:
Delphi
1
2
3
4
5
6
7
8
9
10
function  swap2(x: word): word;
begin
  Result := (x shl 8) + (x shr 8);
end;
 
function  swap4(x: dword): dword;
begin
  Result := (x shl 24)                + ((x shl  8) and $00FF0000) +
           ((x shr  8) and $0000FF00) +  (x shr 24) ;
end;
Хоть и кажется много написано, но итоговый код получается 13 команд против 43 команды в варианте с циклом (для integer).
1
 Аватар для GoodWeather
886 / 588 / 179
Регистрация: 28.02.2017
Сообщений: 2,359
Записей в блоге: 1
17.12.2019, 22:31
PNGImage.pas
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
{Invert bytes using assembly}
function ByteSwap(const a: integer): integer;
{$IFDEF PUREPASCAL}
begin
  PByte(@Result)[0] := PByte(@A)[3];
  PByte(@Result)[1] := PByte(@A)[2];
  PByte(@Result)[2] := PByte(@A)[1];
  PByte(@Result)[3] := PByte(@A)[0];
end;
{$ELSE !PUREPASCAL}
{$IFDEF CPUX86}
asm
  BSWAP EAX
end;
{$ENDIF}
{$IFDEF CPUX64}
asm
  MOV   EAX, ECX
  BSWAP EAX
end;
{$ENDIF}
{$ENDIF PUREPASCAL}
 
function ByteSwap16(inp:word): word;
{$IFDEF PUREPASCAL}
begin
  PByte(@Result)[0] := PByte(@inp)[1];
  PByte(@Result)[1] := PByte(@inp)[0];
end;
{$ELSE !PUREPASCAL}
{$IFDEF CPUX86}
asm
  BSWAP EAX
  SHR   EAX, 16
end;
{$ENDIF}
{$IFDEF CPUX64}
asm
  MOV   EAX, ECX
  BSWAP EAX
  SHR   EAX, 16
end;
{$ENDIF}
{$ENDIF PUREPASCAL}
2
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
17.12.2019, 22:31
Помогаю со студенческими работами здесь

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

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

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

Чтение заголовка PE
День добрый всем. В качестве хобби решил поковыряться с PE-файлами, используя Qt. Хочу сделать отображение структуры выбранного файла. ...

Чтение заголовка BMP
Есть след код, который должен читать заголовок BMP Но он его читаеть криво (пропускает 2 байта) Ктонить может помочь решить эту...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru