![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | 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
|
||||
|
||||
|
Первые байты файла - индентификатор файла, его настоящее расширение. Считывай их и проверяй.
|
|
#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; |
|
#5
|
|||
|
|||
|
Побайтно... Первые символы... Вроде понятно. Но! Это получается идут HEX данные, с которыми я так толком и не разобрался
![]() |
|
#6
|
||||
|
||||
|
Чего с ними разбираться?
255=$FF и так далее. Обычный калькулятор меняет представление с HEX на DEC и обратно по клавишам F5, F6.Читаешь файл или часть файла в MemoryStream и отадаёшь в функцию: Код:
var TF : TTypeFile; begin ... // что в потоке TF := CheckTypeFile(MemStream.Memory); ... |