Подземелье Кода

31-ое марта 2006

Обрабатывать JPEG TImage нагруженное как поэлементное карта в Делфи

Сохранено вниз: 11:15 pm Делфи - Брайан @

Одна проблема с компонентом TImage что она как родной не поддерживает JPegs. JPEG как раз не было как популярное формой назад в предыдущем к средний девяностым годы когда Делфи сперва было начато. Наилучшим образом, сегодня то различный рассказ. Начинающ с Делфи 3, если память служит (я не сделал каждая польза D2), то был введен компонент TJPegImage и TImage смогло быть расширено для того чтобы позволить JPegs быть нагруженным. Сегодняшний компонент TImage может нагрузить JPEG прямо от команды LoadFromFile. Однако, вы все еще не можете сразу манипулировано ему как легко по мере того как вы можете поэлементное карта. Это ясно если вы смотрите структуру свойства изображения TImage.

TPicture имеет свойство поэлементного карты и свойство MetaFile и графическое свойство которое хранит все которое нет поэлементного карты или metafile.

Но вы быстро увидите что очень немногие режимы и пример на паутине общаются с графическим свойством. Они не могут! Структура информации в графике меняет в зависимости от типа изображения.

Так, выходка общаться с JPegs, или что-нибудь еще любят TIFFs, GIFS или Targa (oh мо), получить их данные несжатый и de-переплетенный и задний излишек к свойству поэлементного карты. Маленький известный факт что это точно чему Windows должно сделать в любое время вас выбирает JPEG как предпосылка. Windows нагрузит JPEG за исключением его к BMP и напишет имя того BMP к регистратуре и после этого покажет тот архив вместо первоначально JPEG. Так, мы все должны прекратить обвинить Borland (DevCo) для klunky управления, они делаем его правый низкоуровневый путь. И то есть, в конце концов что мы любим о праве Делфи?

Так, чего мы должны сделать раз мы позволяет потребителю нагрузить архив, мы проверит для того чтобы увидеть если тип TJPegImage. Если он, то мы создаем компонент TJPegImage. Мы после этого задаем JPegImage к свойству поэлементного карты и мы сделаны! Вы можете теперь достигнуть данных по изображения в поэлементном карте.

В Делфи, том смотрит как это:

ДЕЛФИ:
  1. SourceImage.Picture.LoadFromFile (FullFileName);
  2.     если (SourceImage.Picture.Graphic TJPegImage), то
  3.     после этого начните
  4.       JpegImage: = TJpegImage.Create;
  5.       попытка
  6.         JpegImage.Assign (SourceImage.Picture.Graphic);
  7.         SourceImage.Picture.Bitmap.Assign (JpegImage);
  8.       окончательно
  9.       конец;
  10.       FreeAndNil (JpegImage);
  11.     конец;

Задайте чудесная маленькая функция черного ящика построенная в много предметов. Задайте одна из самых опрятных функций в Делфи. Она по-существу признавает другие типы предметов как параметр, и преобразовывает как много из того типа предмета как возможно.

Препятствуйте нам пойти конспект и сказать вас имейте 2 типа предмета TCar и TSuitCase.
C: TCar
S: TSuitcase

Очевидно не смогите сказать s: = c; или c: = s; потому что они разных видов.
Однако вы можете сказать
C.Assign
и внутренность TCar задает метод имеет заявление которое смотрит как:

ДЕЛФИ:
  1. если (источник TSuitcase), то
  2. после этого Self.Trunk.Contents: = Self.Trunk.Contents + TSuitcase (источник). Содержание
  3. еще если (источник TGasolinePump), то
  4. после этого

О'КЕЙ, то звучает довольно non-exciting, но оно получает более лучше! Что если тип предмета неизвестен? Режим TCar может суметь как задать TFordPerfect к себе потому что TFordPerfect наследует от TCar, только TCar не идет суметь как задать TFordPrefect к себе теперь оно? То куда AssignTo приходит в…

ДЕЛФИ:
  1. если (источник TSuitcase), то
  2. после этого Self.Trunk.Contents: = Self.Trunk.Contents + TSuitcase (источник). Содержание
  3. еще если (источник TGasolinePump), то
  4. после этого Self.Tank.Contents: = Self.Tank.Contents + TGasolinePump (источник). Галлоны [1]
  5. другое Source.AssignTo (собственная личность);

AssignTo идет направление совершенно напротив. Персона писать новый компонент чем после этого создает режим который позволит его новому компоненту к самым общим компонентам которые уже существуют. Настолько следующе наш пример, режим AssignTo TFordPrefect мог включить что-нибудь подобное:

ДЕЛФИ:
  1. если (Dest TCar), то
  2. после этого TCar (Dest) .PassengerCompartment: = TCar (Dest) .PassengerCompartment + TPassenger (собственная личность);
  3.  
  4. .

Или в случае TJPegImage, проверки метода AssignTo к видеть если Dest var TBitmap, и если он, то, оно идет через длинний режим понижения давления и преобразования окончательно произвести битовую матрицу истинного прибора независимую и написать те сырцовые биты в Dest.

И что мои друзья как наш компонент TImage, то знает ничего о JPEG Bitmap преобразования получает работу сделано. Оно спрашивает метод TJPegImage AssignTo для того чтобы сделать все если своя работа для его.

Вы можете теперь использовать изображение Picture.BitMap как нормальный. Опрятная вещь что вы можете положить те режимы в ваш метод FormCreate. Так, TImages можно сделать для того чтобы содержать JPEGs на времени конструкции, делая ваше EXE значительно более малой. И после этого оно преобразовывает их, если соотвествующе, к BMPs на продолжительности времени. Славно сохранить 600.000 из пространства изображений на рядом с никакой цене.

Вроде щегольской eh?

(BTW если вы действительно честолюбивы, то, я уверен вы смогло написать тот режим выше так, что оно проверит для того чтобы убеждаться что график нет BMP, WMF или опорожнить и после этого использует режимы info типа для того чтобы спросить тип предмета и instationate перемеююый TPersistent для того чтобы содержать предмет того типа. После этого ваш режим может отрегулировать по мере того как поэлементное карта ЛЮБОЙ тип изображения вы расширяло ваше TImage для того чтобы содержать. Больше на расширять TImages более поздно…)

Никакие комментарии »

Никакие комментарии пока.

Питание RSS для комментариев на этом столбе. URL TrackBack

Выйдите комментарий

Приведено в действие WordPress