Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

TPicture.LoadFromFile - интерпритация формата по содержимому.


Страницы:   1 2 3

Akad ©   (2011-02-27 16:56:00) 

Есть много картинок. У части из них попутаны расширения, то есть png имеют расширение jpeg, gif - png и так далее.
Как известно в борланде работая над TPicture.LoadFromFile пошли по самому простому пути - интерпретация формата файла по расширению, то есть картинки с не правильным расширением эта функция не загрузит.
Вопрос: как с минимумом телодвижений загрузить картинку в TPicture.Graphic? Очень не хочется самому анализировать и переименовывать файл. Должно же быть нормальное готовое решение!


Unknown user   (2012-04-04 17:48:00) [1]

Я когда-то давно писал собственную функцию для определения типа файла по сигнатуре. Если еще нужно, забирайте.

function DetermineFileType(const FileName:string; var DT:TDataType):boolean;
//елементы массива расположены в порядке
//уменьшения ошибки ложного определения типа файла
const ChkTypes:array[0..6] of TDataType=(dtRTF,dtIMG_EMF,dtIMG_BMP,
                                        dtIMG_JPG,dtIMG_WMF,dtTXT,dtIMG_ICO);
var Stream:TFileStream;
   Ind:integer;
   
function IsType(AType:TDataType):boolean;
const cRTFSignature='{\rtf1';
      cBMPSignature='BM';
      cJPGSignature='яШя';
      cEMFSignature=' EMF';
      MaxReadCnt=8192;
var Len,Cnt,TotalCnt:integer;
    Sym,OldSym:Char;
    S:string; Wrd:Word;
    DWrd:LongWord;

begin
 Result:=false;
 Stream.Position:=0;
 case AType of

  dtRTF: begin
          Len:=Length(cRTFSignature);
          SetString(S,nil,Len);
          Cnt:=Stream.Read(Pointer(S)^,Len);
          if Cnt<>Len then exit;
          Result:=S=cRTFSignature;
         end;

  dtTXT: begin
          TotalCnt:=0; OldSym:=#0;
          while TotalCnt<MaxReadCnt do
           begin
           Len:=SizeOf(Sym);
           Cnt:=Stream.Read(Sym,Len);
           if Cnt<>Len then exit;
           if Sym=#10 then begin
            Result:=OldSym=#13;
            if not Result then exit;
           end; {if}
           OldSym:=Sym;
           Inc(TotalCnt,Cnt);
          end; {while}
         end;

   dtIMG_BMP: begin
               Len:=SizeOf(Wrd);
               Cnt:=Stream.Read(Wrd,Len);
               if Cnt<>Len then exit;
               Result:=Wrd=$4D42;
              end;

   dtIMG_JPG: begin
               Len:=Length(cJPGSignature);
               SetString(S,nil,Len);
               Cnt:=Stream.Read(Pointer(S)^,Len);
               if Cnt<>Len then exit;
               Result:=S=cJPGSignature;
              end;

   dtIMG_WMF: begin
               Stream.Seek(4,0);
               Len:=SizeOf(Wrd);
               Cnt:=Stream.Read(Wrd,Len);
               if Cnt<>Len then exit;
               Result:=(Wrd=$0300) or (Wrd=$0100);
              end;

   dtIMG_EMF: begin
               Stream.Seek(40,0);
               Len:=Length(cEMFSignature);
               SetString(S,nil,Len);
               Cnt:=Stream.Read(Pointer(S)^,Len);
               if Cnt<>Len then exit;
               Result:=S=cEMFSignature;
              end;

   dtIMG_ICO: begin
               Len:=SizeOf(DWrd);
               Cnt:=Stream.Read(DWrd,Len);
               if Cnt<>Len then exit;
               Result:=DWrd=$10000;
              end;

 end; {case}
end; {function IsType}

begin
Stream:=TFileStream.Create(FileName,fmOpenRead or fmShareDenyWrite);
try
 Result:=false;
 for Ind:=0 to High(ChkTypes) do
  if IsType(ChkTypes[Ind]) then begin
   DT:=ChkTypes[Ind];
   Result:=true;
   exit;
  end;
finally
 Stream.Free;
end;
end;


brother   (2012-04-01 20:29:00) [2]

> </>

это для XHTML
а для HTML закрывающий тэго не нужен...


Anatoly Podgoretsky   (2012-04-01 19:20:00) [3]

</>


brother   (2012-03-31 19:48:00) [4]

> по спецификации каждый тег <TEG> должен быть закрыт </TEG>

нет не каждый... например: Тег <IMG>
http://html.manual.ru/book/html/body/objects/img.php
не имеет конечного тега.


Anatoly Podgoretsky   (2012-03-31 08:16:00) [5]

Ну правильно говоришь, и большинство браузеров прощают это. Например по спецификации каждый тег <TEG> должен быть закрыт </TEG>, а в реальности не так и много хуже. Поэтому определять по сигнатуре HTML гнилое дело. При проверке нужна ветвь ELSE


brother   (2012-03-31 05:56:00) [6]

мы говорим - сайт должен отвечать спецификации html!
они говорят - зачем? браузер же "кушает" наш код?!

зы. но всеж спецификация есть и ее надо придерживаться...


Anatoly Podgoretsky   (2012-03-30 21:45:00) [7]

> brother  (30.03.2012 21:27:37)  [37]

<!DOCTYPE

Вставляют генераторы, люди редко, учитывая поголовное “воровство” и это не
срабатывает, сайты тупо вставляют свой текст в начале текста, и это часто не
html или <!DOCTYPE


brother   (2012-03-30 21:29:00) [8]

> С HTML так не пойдет,

впрочем, разговор шел про графические файлы и их сигнатуры. Я потому и не въехал сразу о чем речь ;)


brother   (2012-03-30 21:27:00) [9]

> местоположения сигнатуры

а понял! почемуже нет?:
<!DOCTYPE
местоположение вполне точно определено


Anatoly Podgoretsky   (2012-03-30 21:09:00) [10]

> brother  (30.03.2012 21:01:35)  [35]

Не совпадает в части местоположения сигнатуры


brother   (2012-03-30 21:01:00) [11]

> для HTML ни одно из условий не выполняетсяю

я не понял о чем речь?


Anatoly Podgoretsky   (2012-03-30 20:05:00) [12]

Ты зря думаешь что закрыт, как видели это вопрос на протяжение десятка лет, так и будем видеть еще.


Dimka Maslov   (2012-03-30 19:51:00) [13]

РОБЯТО! Посмотрите на дату первого поста этой темы! Вопрос закрыт год назад!


Anatoly Podgoretsky   (2012-03-30 19:26:00) [14]


> не понял, о чем речь? сигнатуры отменили?

Сигнатура когда опрделеный текст в определеном месте, для HTML ни одно из условий не выполняетсяю


brother   (2012-03-30 18:58:00) [15]

> С HTML так не пойдет,

не понял, о чем речь? сигнатуры отменили?


DVM   (2012-03-30 17:00:00) [16]


> Anatoly Podgoretsky ©   (30.03.12 16:55) [29]

Да я ясное дело, но лучше хоть что-то, чем вообще ничего.

Вот кстати куча сигнатур http://mark0.net/download/triddefs_xml.rar


Anatoly Podgoretsky   (2012-03-30 16:55:00) [17]

С HTML так не пойдет, совсем не обязательно что это первые символы текста.


DVM   (2012-03-30 16:30:00) [18]

У этого подхода даже название есть какое то, но я забыл его.


DVM   (2012-03-30 16:29:00) [19]


> Akad   (27.02.11 16:56) 

Ищешь сигнатуры известных форматов и по аналогии с:

class function TMimeType.GuessContentTypeFromContent(AContent: PAnsiChar): string;
var
 c1, c2, c3, c4, c5, c6, c7, c8: AnsiChar;
begin
 c1 := AContent[0];
 c2 := AContent[1];
 c3 := AContent[2];
 c4 := AContent[3];
 c5 := AContent[4];
 c6 := AContent[5];
 c7 := AContent[6];
 c8 := AContent[7];
 result := '';
 if (c1 = 'G') and (c2 = 'I') and (c3 = 'F') and (c4 = '8') then
   result := 'image/gif'
 else if (c1 = '#') and (c2 = 'd') and (c3 = 'e') and (c4 = 'f') then
   result := 'image/x-bitmap'
 else if (c1 = '!') and (c2 = ' ') and (c3 = 'X') and (c4 = 'P')
   and (c5 = 'M') and (c6 = '2') then
   result := 'image/x-pixmap'
 else if (c1 = #137) and (c2 = #80) and (c3 = #78) and (c4 = #71) and (c5 = #13)
   and
   (c6 = #10) and (c7 = #26) and (c8 = #10) then
   result := 'image/png'
 else if (c1 = #$2E) and (c2 = #$73) and (c3 = #$6E) and (c4 = #$64) then
   result := 'audio/basic' // .au format, big endian
 else if (c1 = #$64) and (c2 = #$6E) and (c3 = #$73) and (c4 = #$2E) then
   result := 'audio/basic' // .au format, little endian
 else if (c1 = '<') then
 begin
   if ((c2 = '!')) or
     ((c2 = 'h') and (c3 = 't') and (c4 = 'm') and (c5 = 'l')) or
     ((c2 = 'h') and (c3 = 'e') and (c4 = 'a') and (c5 = 'd')) or
     ((c2 = 'b') and (c3 = 'o') and (c4 = 'd') and (c5 = 'y')) or
     ((c2 = 'H') and (c3 = 'T') and (c4 = 'M') and (c5 = 'L')) or
     ((c2 = 'H') and (c3 = 'E') and (c4 = 'A') and (c5 = 'D')) or
     ((c2 = 'B') and (c3 = 'O') and (c4 = 'D') and (c5 = 'Y')) then
     result := 'text/html'
   else if (c2 = '?') and (c3 = 'x') and (c4 = 'm') and (c5 = 'l') and (c6 =
     ' ') then
     result := 'application/xml';
 end
 else if (c1 = #$FF) and (c2 = #$D8) and (c3 = #$FF) and (c4 = #$E0) then
   result := 'image/jpeg'
 else if (c1 = #$FF) and (c2 = #$D8) and (c3 = #$FF) and (c4 = #$EE) then
   result := 'image/jpg'
 else if (c1 = 'R') and (c2 = 'a') and (c3 = 'r') and (c4 = '!') then
   result := 'application/x-rar'
 else if (c1 = 'F') and (c2 = 'W') and (c3 = 'S') then
   result := 'application/x-shockwave-flash'
 else if (c1 = 'M') and (c2 = 'S') and (c3 = 'C') and (c4 = 'F') then
   result := 'application/cab'
 else if (c1 = 'M') and (c2 = 'Z') then
   result := 'application/x-msdos-program'
 else if (c1 = 'P') and (c2 = 'K') and (c3 = #$03) and (c4 = #$04) then
   result := 'application/zip'
 else if (c1 = 'B') and (c2 = 'M') then
   result := 'image/bmp';
end;


Кщд   (2012-03-30 15:26:00) [20]

>Соискатель   (30.03.12 13:42) [25]
толсто


Страницы:   1 2 3

Наверх

Титульная страница Поиск, карта сайта Написать письмо