Member
Статус: Не в сети Регистрация: 05.01.2003 Откуда: Москва Фото: 2
To all Люди, есть проблема некоторая.
Я пишу один плагинчик для проги All My Movies (если кто знает, что это за прога - плагинчик нужен в основном мне, но вроде тоже некоторые им пользуются). Дык вот, есть один код, который позволяет несколько сжимать картинку по горизонтали и вертикали, проводить сглаживание краев и изменять качество JPEG. Как отдельный код все работает просто на ура, в плагине раньше работало, сейчас не хочет. Разработчик AMM говорит, что ничего не менял в моторчике работы с плагинами.
Плиз, посмотрите часть кода, може я чего-то намудрил или можно как-нибудь оптимизировать.
Код:
Function OptimizingComplete(FileName: String; Optimizing: Boolean; Quality, MaxWidth: Integer): Integer; Var TempFileName: String; Bit: TJPEGImage; NewWidth, NewHeight, BitWidth, BitHeight: Integer; Bitmap: TBitmap; OldFileSize, NewFileSize: Integer; R: TRect; Begin TempFileName := FileName + '.tmp'; Result := 0;
Bit := TJPEGImage.Create(Nil); Bit.Visible := False; Bitmap := Nil; OldFileSize := GetFileSize(FileName); Bit.LoadFromFile(FileName); BitWidth := Bit.Picture.Bitmap.Width; BitHeight := Bit.Picture.Bitmap.Height; If MaxWidth > 0 Then If (BitWidth > MaxWidth) Or (BitHeight > MaxWidth) Then Begin SetMaxValueInBitmap(BitWidth, BitHeight, MaxWidth, NewWidth, NewHeight); Bitmap := TBitmap.Create; Bitmap.Width := NewWidth; Bitmap.Height := NewHeight; Bitmap.PixelFormat := Bit.Picture.Bitmap.PixelFormat; Stretch(Bit.Picture.Bitmap, Bitmap, Lanczos3Filter, 3.0); Bit.Width := NewWidth; Bit.Height := NewHeight; Bit.Picture.Bitmap.Width := NewWidth; Bit.Picture.Bitmap.Height := NewHeight; Bit.Picture.Bitmap.Assign(Bitmap); Bit.Update; End;
If Optimizing Then AntiAliasing(Bit.Picture.Bitmap, 4); Bit.Quality := Quality; Bit.NumOfColors := TrueColor; Bit.DCTMethod := Integ; Bit.Progressive := True; Bit.Dither := FS; Bit.FastProcessing := False; Bit.SaveToFile(TempFileName); NewFileSize := GetFileSize(TempFileName); Bit.Free; If Bitmap <> Nil Then Bitmap.Free;
Result := NewFileSize - OldFileSize; MoveFile(TempFileName, FileName); End;
_________________ Устав традиций нужно соблюдать, Хоть и не раз ответят вам отказом: Конечно, баба может и не дать, Но предложить ты ей всегда обязан!
Member
Статус: Не в сети Регистрация: 05.01.2003 Откуда: Москва Фото: 2
123kis Или через FindFirstFile можно найти атрибуты (только не забудь закрывать FindClose).
Пример. Прочесть дату последнего обращения к файлу (если конечно в виндовозе такая фича включена)
Код:
var FileHandle: THandle; LocalFileTime: TFileTime; DosFileTime: DWORD; LastAccessedTime: TDateTime; FindData: TWin32FindData; begin FileHandle := FindFirstFile('AnyFile.FIL', FindData); if FileHandle <> INVALID_HANDLE_VALUE then begin Windows.FindClose(Handle); if (FindData.dwFileAttributes and FILE_ATTRIBUTE_DIRECTORY) = 0 then begin FileTimeToLocalFileTime(FindData.ftLastWriteTime, LocalFileTime); FileTimeToDosDateTime(LocalFileTime, LongRec(DosFileTime).Hi, LongRec(DosFileTime).Lo); LastAccessedTime := FileDateToDateTime(DosFileTime); Label1.Caption := DateTimeToStr(LastAccessedTime); end; end; end;
Или так.
Используем функцию SetFileAttributes() и GetFileAttributes(). Задаём ей два параметра: сначала имя файла, затем задаваемые атрибуты. Например, так можем файл сделать "только для чтения"
SetFileAttributes('C:\file.txt', faReadOnly);
Можно задавать следующие значения:
faReadOnly
faHidden
faSysFile
faVolumeID
faDirectory
faArchive
faAnyFile
_________________ Устав традиций нужно соблюдать, Хоть и не раз ответят вам отказом: Конечно, баба может и не дать, Но предложить ты ей всегда обязан!
Member
Статус: Не в сети Регистрация: 05.01.2003 Откуда: Москва Фото: 2
123kis НУ еще раз - можно через FindFileFirst (пример написал).
FindData.dwFileAttributes - будут тебе тут все, атрибуты (побитово) сам сумеешь выделить.
Либо попробовать с помощью FindFirst (тоже самое, что и предыдущее).
Примерный пример использования:
Код:
Result := FindFirst(Path, Attr, SearchRec); while Result = 0 do begin ProcessSearchRec(SearchRec); Result := FindNext(SearchRec); end; FindClose(SearchRec);
А так, SearchRec это переменная типа рекорд следующего типа:
Member
Статус: Не в сети Регистрация: 14.01.2004 Откуда: Киев, Украина
Максим а какой ответ ты хочешь получить? Такую программу не каждый испольщует, это раз. А оптимизировать можно - если не использовать делфовский класс для работы с jpeg.
Member
Статус: Не в сети Регистрация: 05.01.2003 Откуда: Москва Фото: 2
Daemon А я и не дельфовский класс использую. По работе использую собственный класс по работе с JPEG.
И он точно работает, так же как и тот код, который положил сюда.
_________________ Устав традиций нужно соблюдать, Хоть и не раз ответят вам отказом: Конечно, баба может и не дать, Но предложить ты ей всегда обязан!
Подскажите как в Windows взять точное время до миллисекунд
Для разницы в ms можно и с помощью New и с помощью GetTickCount.
Aleksoid1978 писал(а):
а то функция Now возвращает, но у нее погрешность вплоть до секунды. Вот в таком коде
Драсте вам… Прям как в том анекдоте: "а хто всрався? – невестка…" По твоему коду у меня возвращается: S1 = 14.44.27.484 -> S2 = 14.44.27.500 И для GetTickCount разность резалтов ~ +/- 1 ms. Так что если у тебя твой вышеприведенный код выдает одинаковый резалт с учетом Sleep(10), то это "твое" аппаратно/софтовое мутево. Добавлено спустя 6 минут, 23 секунды
Aleksoid1978 писал(а):
S1 и S2 бывает показывают одно и тоже, несмотря на Sleep(10)
&
Aleksoid1978 писал(а):
но у нее погрешность вплоть до секунды.
Дык я не понял, то у тебя ваааще разницы нет, то целая секунда или как?
Member
Статус: Не в сети Регистрация: 05.01.2003 Откуда: Москва Фото: 2
Aleksoid1978 Пользуйся GetTickCount. Если будет опять одинаковое время, то значит аппаратная часть прикалывается. У меня без мелкомягкого патча так же выдается одинаковое время (из-за двухядерника прикол с таймером идет такой в моем случае)
_________________ Устав традиций нужно соблюдать, Хоть и не раз ответят вам отказом: Конечно, баба может и не дать, Но предложить ты ей всегда обязан!
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения