Модераторы: Snowy, MetalFan, bems, Poseidon

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Поисковик картинок для чайника:), Помогите чайнику) 
V
    Опции темы
Данкинг
Дата 9.3.2010, 17:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Yersinia pestis
****


Профиль
Группа: Завсегдатай
Сообщений: 8302
Регистрация: 7.11.2006
Где: მოსკოვი

Репутация: 11
Всего: 130



Цитата(Serchos @  9.3.2010,  17:29 Найти цитируемый пост)
А как вообще у *.png узнать обычные параметры?) 

DRKB в помощь.
Код

unit ImgSize; 

 

interface 

 

uses Classes; 

 

 

procedure GetJPGSize(const sFile: string; var wWidth, wHeight: Word); 

procedure GetPNGSize(const sFile: string; var wWidth, wHeight: Word); 

procedure GetGIFSize(const sGIFFile: string; var wWidth, wHeight: Word); 

 

 

implementation 

 

uses SysUtils; 

 

function ReadMWord(f: TFileStream): Word; 

type 

TMotorolaWord = record 

   case Byte of 

     0: (Value: Word); 

     1: (Byte1, Byte2: Byte); 

end; 

var 

MW: TMotorolaWord; 

begin 

{ It would probably be better to just read these two bytes in normally } 

{ and then do a small ASM routine to swap them.  But we aren't talking } 

{ about reading entire files, so I doubt the performance gain would be } 

{ worth the trouble. } 

f.read(MW.Byte2, SizeOf(Byte)); 

f.read(MW.Byte1, SizeOf(Byte)); 

Result := MW.Value; 

end; 

 

procedure GetJPGSize(const sFile: string; var wWidth, wHeight: Word); 

const 

ValidSig: array[0..1] of Byte = ($FF, $D8); 

Parameterless = [$01, $D0, $D1, $D2, $D3, $D4, $D5, $D6, $D7]; 

var 

Sig: array[0..1] of byte; 

f: TFileStream; 

x: integer; 

Seg: byte; 

Dummy: array[0..15] of byte; 

Len: word; 

ReadLen: LongInt; 

begin 

FillChar(Sig, SizeOf(Sig), #0); 

f := TFileStream.Create(sFile, fmOpenRead); 

try 

   ReadLen := f.read(Sig[0], SizeOf(Sig)); 

 

   for x := Low(Sig) to High(Sig) do 

     if Sig[x] <> ValidSig[x] then ReadLen := 0; 

 

   if ReadLen > 0 then 

   begin 

     ReadLen := f.read(Seg, 1); 

     while (Seg = $FF) and (ReadLen > 0) do 

     begin 

       ReadLen := f.read(Seg, 1); 

       if Seg <> $FF then 

       begin 

         if (Seg = $C0) or (Seg = $C1) then 

         begin 

           ReadLen := f.read(Dummy[0], 3); { don't need these bytes } 

           wHeight := ReadMWord(f); 

           wWidth  := ReadMWord(f); 

         end 

         else 

         begin 

           if not (Seg in Parameterless) then 

           begin 

             Len := ReadMWord(f); 

             f.Seek(Len - 2, 1); 

             f.read(Seg, 1); 

           end 

           else 

             Seg := $FF; { Fake it to keep looping. } 

         end; 

       end; 

     end; 

   end; 

finally 

   f.Free; 

end; 

end; 

 

procedure GetPNGSize(const sFile: string; var wWidth, wHeight: Word); 

type 

TPNGSig = array[0..7] of Byte; 

const 

ValidSig: TPNGSig = (137,80,78,71,13,10,26,10); 

var 

Sig: TPNGSig; 

f: tFileStream; 

x: integer; 

begin 

FillChar(Sig, SizeOf(Sig), #0); 

f := TFileStream.Create(sFile, fmOpenRead); 

try 

   f.read(Sig[0], SizeOf(Sig)); 

   for x := Low(Sig) to High(Sig) do 

     if Sig[x] <> ValidSig[x] then Exit; 

   f.Seek(18, 0); 

   wWidth := ReadMWord(f); 

   f.Seek(22, 0); 

   wHeight := ReadMWord(f); 

finally 

   f.Free; 

end; 

end; 

 

 

procedure GetGIFSize(const sGIFFile: string; var wWidth, wHeight: Word); 

type 

TGIFHeader = record 

   Sig: array[0..5] of char; 

   ScreenWidth, ScreenHeight: Word; 

   Flags, Background, Aspect: Byte; 

end; 

 

TGIFImageBlock = record 

   Left, Top, Width, Height: Word; 

   Flags: Byte; 

end; 

var 

f: file; 

Header: TGifHeader; 

ImageBlock: TGifImageBlock; 

nResult: integer; 

x: integer; 

c: char; 

DimensionsFound: boolean; 

begin 

wWidth  := 0; 

wHeight := 0; 

 

if sGifFile = '' then 

   Exit; 

 

{$I-} 

FileMode := 0;   { read-only } 

AssignFile(f, sGifFile); 

reset(f, 1); 

if IOResult <> 0 then 

   { Could not open file } 

   Exit; 

 

{ Read header and ensure valid file. } 

BlockRead(f, Header, SizeOf(TGifHeader), nResult); 

if (nResult <> SizeOf(TGifHeader)) or (IOResult <> 0) or 

   (StrLComp('GIF', Header.Sig, 3) <> 0) then 

begin 

   { Image file invalid } 

   Close(f); 

   Exit; 

end; 

 

{ Skip color map, if there is one } 

if (Header.Flags and $80) > 0 then 

begin 

   x := 3 * (1 shl ((Header.Flags and 7) + 1)); 

   Seek(f, x); 

   if IOResult <> 0 then 

   begin 

     { Color map thrashed } 

     Close(f); 

     Exit; 

   end; 

end; 

 

DimensionsFound := False; 

FillChar(ImageBlock, SizeOf(TGIFImageBlock), #0); 

{ Step through blocks. } 

BlockRead(f, c, 1, nResult); 

while (not EOF(f)) and (not DimensionsFound) do 

begin 

   case c of 

     ',': { Found image } 

       begin 

         BlockRead(f, ImageBlock, SizeOf(TGIFImageBlock), nResult); 

         if nResult <> SizeOf(TGIFImageBlock) then 

         begin 

           { Invalid image block encountered } 

           Close(f); 

           Exit; 

         end; 

         wWidth := ImageBlock.Width; 

         wHeight := ImageBlock.Height; 

         DimensionsFound := True; 

       end; 

     'y': { Skip } 

       begin 

         { NOP } 

       end; 

     { nothing else.  just ignore } 

   end; 

   BlockRead(f, c, 1, nResult); 

end; 

Close(f); 

{$I+} 

end; 

 

end. 




--------------------
There's nothing left but silent epitaphs.
PM MAIL WWW   Вверх
Serchos
Дата 13.3.2010, 12:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 7.3.2010

Репутация: нет
Всего: нет



Всем спасибо за помощь!...все работает!
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Для новичков"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0435 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.