
Мне надо сделать следующее:
1. Получить изображение с сервера по протоколу http - сделал
2. В зависимости от размера изображения сделать его ресайз - сделал, но возникли проблемы, сейчас буду описывать:)
Вобщем написал данный функционал, начал тестировать - все замечательно работает, и тут программа спотыкается с JPEG error, я так понял ошибка с кодом 53 (попутный вопрос - в случае возникновеня исключений, лазарь как-то мало сообщает подробности, хотя бы код ошибки писал - это где-то настраивается?)
Работаю с TJPGImage, вот кусочек кода:
- Код: Выделить всё
procedure TForm1.Button5Click(Sender: TObject);
var
FileIMG:TImage;
IMG:TJPGImage;
begin
srcURL:=copy(srcURL,1,pos('"',srcURL)-1); //получаю url картинки из уже обработанных данных
srcFileName:=FloatToStr(DateTimeToUnix(now))+'_'+IntToStr(GetCountFiles(DirNews)+1); //генерирую новое название картинки без расширения GetCountFiles - функция возвращает количество файлов в каталоге, чтобы картинки имели название 1,2,3.... DirNews - каталог в котором будут жить картинки
extFileName:=ExtractFileExt(srcURL); //получаю текущее расширение картинки
if HTTP.HTTPMethod('GET',srcURL) then begin
HTTP.Document.SaveToFile(DirNews+'\'+srcFileName+extFileName); //забрал картинку к себе и сохранил на диск
IMG:=TJPGImage.Create;
FileIMG:=TImage.Create(Nil);
IMG.LoadFromFile(DirNews+'\'+srcFileName);
if IMG.Width>=450 then begin
scale:=450/IMG.Width;
FileIMG.Height:=round(IMG.Height*scale);
FileIMG.Width:=450;
FileIMG.Canvas.StretchDraw(rect(0,0,FileIMG.Width,FileIMG.Height),IMG);
If DirectoryExists (DirNews+'\thumbs')=false then ForceDirectories(DirNews+'\thumbs\');
FileIMG.Picture.SaveToFile(DirNews+'\thumbs\'+srcFileName);
end;
end;
Но иногда IMG.LoadFromFile(DirNews+'\'+srcFileName) вызывает исключение, с кодом 53 (насколько я смог понять)
Покопавшись немного увидел, что картинка имеет расширение jpg, а сигнатура показывает что это PNG
В компонентах лазаря есть пример работы с TJPGImage - попробовал через нее загрузить проблемную картинку - результат такой же - возникает исключение.
Да, можно конечно обработать экзепшн и забить на картинку, но увы - не выход - картинка должна быть обработана.
Написал функцию, которая анализирует сигнатуру:
- Код: Выделить всё
Function TForm1.GetSign(const FileName : string) : string;
Var
FStream:TFileStream;
buff: int64;
begin
result:='';
buff:=0;
FStream := TFileStream.Create(FileName, fmOpenRead or fmShareDenyRead);
FStream.Read(buff, sizeof(buff));
FStream.Free;
if (buff and $FFFFFF)=$FFD8FF then result := '.jpg';
if (buff and $FFFFFFFF)=$38464947 then result := '.gif';
if buff=$0A1A0A0D474E5089 then result := '.png';
end;
Кусок кода переписал в таком виде:
- Код: Выделить всё
srcURL:=copy(srcURL,1,pos('"',srcURL)-1);
srcFileName:=FloatToStr(DateTimeToUnix(now))+'_'+IntToStr(GetCountFiles(DirNews)+1);
extFileName:=ExtractFileExt(srcURL);
if HTTP.HTTPMethod('GET',srcURL) then begin
HTTP.Document.SaveToFile(DirNews+'\image.tmp');
//showmessage(IntToStr(FStream.Read(buff, sizeof(buff))));
//Обработка картинки
//создание превью
IMG:=TJPGImage.Create;
FileIMG:=TImage.Create(Nil);
FileType:=GetSign(DirNews+'\image.tmp');
If (FileType=UTF8LowerCase(extFileName)) or ((UTF8LowerCase(extFileName)='.jpeg') and (FileType='.jpg'))
then srcFileName:=srcFileName+extFileName else srcFileName:=srcFileName+FileType;
renamefile(DirNews+'\image.tmp',DirNews+'\'+srcFileName);
IMG.LoadFromFile(DirNews+'\'+srcFileName);
if IMG.Width>=450 then begin
scale:=450/IMG.Width;
FileIMG.Height:=round(IMG.Height*scale);
FileIMG.Width:=450;
FileIMG.Canvas.StretchDraw(rect(0,0,FileIMG.Width,FileIMG.Height),IMG);
If DirectoryExists (DirNews+'\thumbs')=false then ForceDirectories(DirNews+'\thumbs\');
FileIMG.Picture.SaveToFile(DirNews+'\thumbs\'+srcFileName);
end;
end;
То есть, если сигнатура не совпадает с расширением, то файлу даем расширение согласно сигнатуре
Но все равно получаю исключение.
Попробовал загрузить уже переименованный файл в пример от лазаря - там нормально все загружается.
Может я что-то не учел?