![]() |
|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
![]() Столкнулся с проблемой определения формата файла. Есть такой код:
Код:
if OpenPictureDialog1.Execute then begin Bmp := TBitmap.Create; Jpg := TJPEGImage.Create; Jpg.LoadFromFile(OpenPictureDialog1.FileName); Bmp.Assign(Jpg); Image1.Picture.Assign(Bmp); end; Так вот. Задача состоит в том что бы определить тип открываемого файла и в последствии уже если это *.jpg преобразовать его в *.bmp, а если это и есть *.bmp то оставить без изменений. Использовать обычный метод определения - это когда по имени файла вырезается текст после точки и определяется тип, как бы так не особо актуален. точек может быть много, да и, а что если *.bmp изображение просто переименован формат на *.jpg. В программах он отображается, но вот в нашем случае тогда возникнет ошибка. Как то так вообщем чуток запутанно для меня это получилось. |
#2
|
||||
|
||||
![]() Первые байты файла - индентификатор файла, его настоящее расширение. Считывай их и проверяй.
Работа пpогpаммиста и шамана имеет очень много общего: оба боpмочyт непонятные слова, совеpшают непонятные действия и не могyт объяснить, как оно pаботает. |
#3
|
|||
|
|||
![]() Цитата:
|
#4
|
||||
|
||||
![]() Я проверяю так:
Код:
type TTypeFile = (tfBMP, tfICON, tfCURSOR, tfWAVE, tfMIDI, tfHUC, tfJPG, tfGIF, tfTIF, tfMO3, tfPNG, tfPCX, tfUnknown); const THeaderFile : array[0..11, 0..6] of Byte = ( {BMP} ($42, $4D, 0, 0, 0, 0, 2), {ICON} ( 0, 0, 1, 0, 0, 0, 4), {CURSOR} ( 0, 0, 2, 0, 0, 0, 4), {WAVE} ($52, $49, $46, $46, 0, 0, 4), {MIDI} ($4D, $54, $68, $64, 0, 0, 4), {HUC} ($48, $55, $43, 0, 0, 0, 3), {JPG} ($FF, $D8, $FF, 0, 0, 0, 3), {GIF} ($47, $49, $46, $38, 0, 0, 4), {TIF} ($49, $49, $2A, $00, 0, 0, 4), {MO3} ($4D, $4F, $33, $04, 0, 0, 4), {PNG} ($89, $50, $4E, $47, $0D, $0A, 6), {PCX} ($0A, $05, 0, 0, 0, 0, 2)); function CheckTypeFile(P : Pointer) : TTypeFile; var I : Integer; begin Result := tfUnknown; for I := Low(THeaderFile) to High(THeaderFile) do if CompareMem(P, @THeaderFile[i], THeaderFile[i][High(THeaderFile[0])]) then begin Result := TTypeFile(I); Break; end; end; Je venus de nulle part 55.026263 с.ш., 73.397636 в.д. |
#5
|
|||
|
|||
![]() Побайтно... Первые символы... Вроде понятно. Но! Это получается идут HEX данные, с которыми я так толком и не разобрался
![]() |
#6
|
||||
|
||||
![]() Чего с ними разбираться?
![]() Читаешь файл или часть файла в MemoryStream и отадаёшь в функцию: Код:
var TF : TTypeFile; begin ... // что в потоке TF := CheckTypeFile(MemStream.Memory); ... Je venus de nulle part 55.026263 с.ш., 73.397636 в.д. |
#7
|
|||
|
|||
![]() Цитата:
|
#8
|
||||
|
||||
![]() Мой экстрасенсорный дар подсказывает мне, что у мсье сложности с 16-ричной системой счисления?
Оставайтесь хорошими людьми... VK id2634397, ds [at] phoenix [dot] dj |
#9
|
||||
|
||||
![]() Собственно, для начала, хватит и тех форматов, что у меня описаны. Лишние не сложно выбросить (HUC нигде и никогда не встретишь
![]() К примеру: Код:
{BMP} ($42, $4D, 0, 0, 0, 0, 2), Je venus de nulle part 55.026263 с.ш., 73.397636 в.д. Последний раз редактировалось angvelem, 03.01.2012 в 23:16. |
#10
|
|||
|
|||
![]() Вообщем у меня так получилось. не знаю на сколько это правильно. Хотя для проверки этого будет достаточно, но вот для преобразования всего файла в HEX данные нет.
Код:
procedure TForm1.Button1Click(Sender: TObject); var Typ: TStringList; a,b: string; begin If OpenDialog1.Execute then begin Typ := TStringList.Create; Typ.LoadFromFile(OpenDialog1.FileName); a:=Typ.Text; b := IntToHex(Ord(a[1]), 2)+ IntToHex(Ord(a[2]), 2)+ IntToHex(Ord(a[3]), 2); // --- /// if b = '89504E' then ShowMessage('PNG'); if b = 'FFD8FF' then ShowMessage('JPG'); if b = '424DFA' then ShowMessage('BMP'); end; end; |
#11
|
||||
|
||||
![]() Понял твою проблему. Понятие DEC, HEC это для человека. Комп работает в бинарной системе. Ничего не нужно конвертить, считываешь в поток и отдаёшь функции. А уж ответ проверяешь через case.
Je venus de nulle part 55.026263 с.ш., 73.397636 в.д. |
#12
|
|||
|
|||
![]() Цитата:
Маньяк. Код:
var Stream : TFileStream; Buf : Pointer; begin GetMEm(Buf,5); Stream := TFileStream.Create(AFileName,fmOpenRead); Try Stream.ReadBuffer(Buf^,5); case CheckTypeFile(Buf) of // Функуию тебе дали... // Здесь работаешь уже с опр. типом tfBMP : Begin ... End; Else Raise Exception.Create('Unknown format'); end; Finally Stream.Free; FreeMem(Buf,5); End; end; |
#13
|
||||
|
||||
![]() Только маленькая поправка, запросить нужно 7 байт. 6 на определение формата и дополнительный - на длину проверки. Хотя... как определение типа переписать.
Je venus de nulle part 55.026263 с.ш., 73.397636 в.д. |
#14
|
|||
|
|||
![]() Не, запрашивать надо 6 (моя ошибка, невнимательно посмотрел), а функцию тоже надо поправить, что бы она проверяла кол-во байт, которое указано в последнем элементе массива. Или массив по другому организовать, например как-то так:
Код:
type TFormatSample = record CheckLength : Integer; Sample : Array [0..5] Of Byte; end; const THeaderFile : array[0..11] of TFormatSample = ( {BMP} CheckLength: 2; Sample: ($42, $4D, 0, 0, 0, 0), ...); Ну и функцию соотв. образом поправить. |
#15
|
||||
|
||||
![]() Если таким способом, то да 6 байт, но я особенно не заморачивался с созданием структуры, хотя так удобнее, а "танцевал" от формата PNG, у него самая длинная "шапка" для определения и добавил 7-ой байт с длиной проверки. И функция не проверяет длину, а просто подставляет в CompareMem последний байт из массива.
Je venus de nulle part 55.026263 с.ш., 73.397636 в.д. Последний раз редактировалось angvelem, 04.01.2012 в 04:04. |