![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
TPicture.LoadFromFile - интерпритация формата по содержимому.
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]
толсто