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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Увеличение/уменьшение фрагмента TImage на форме, создание инструмента Лупа 
:(
    Опции темы
Amalthea
Дата 4.2.2012, 15:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Здравствуйте!
Только начала изучать Делфи7. Не нашла информации на сайте. Решила спросить.
У меня есть дочерняя форма с компонентом TImage с загруженной картинкой, которая по размерам полностью вписывается в форму. ClientHeight/Whidth доч.формы сделала равными 80% от ClientHeight/Whidth главной формы (но это не суть). 
Как увеличить/уменьшить фрагмент интересующий части изображения TImage (с помощью колесика на мышке), чтобы ClientHeight/Whidth оставался прежним (те же 80% от родит.формы)? Как изображено на картинках ниже.
user posted image
Я так понимаю надо использовать OnMouseWheel. А как, не могу найти.
user posted image
И в идеале еще нужно создать инструмент Лупа для увеличения, уменьшения фрагментов картинки.
user posted image
Спасибо.
PM MAIL   Вверх
Illusion Dolphin
Дата 4.2.2012, 22:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Пробовали заглянуть в шапку раздела http://forum.vingrad.ru/forum/topic-45912/...e-controls.html ?


--------------------
В мире всего две бесконечности: вселенная и человеческая глупость... На счёт вселенной я не уверен.
Шифрование и организация фотографий - Photo Database 4.5
PM MAIL WWW ICQ   Вверх
Amalthea
Дата 5.2.2012, 09:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Спасибо, посмотрю smile
PM MAIL   Вверх
DimaDD
Дата 6.2.2012, 18:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Воспользуйтесь событием OnMouseWheel той формы, на которой лежит TImage, в его обработке и реализовывайте масштабирование.

Хороший доп. вариант ещё - поместить TImage не прямо на форму, а на ScrollBox, занимающий всю клиентскую область. Тогда при слишком большой картинке будут появляться полосы прокрутки (для них лучше свойства Tracking и Smooth сделать True). Но тогда же и колёсико мыши станет не масштабировать, а двигать бегунки полос (т.е. ScrollBox будет перехватывать события от колёсиков). Для учёта таких случаев можно сделать масштабирование не одним только колёсиком, а, например, сочетанием "колёсико+Ctrl": просто в обработчик OnMouseWheel формы (не ScrollBox'а) надо добавить проверку:

Код

procedure TForm1.FormMouseWheel(Sender: TObject; Shift: TShiftState; WheelDelta: Integer; MousePos: TPoint; var Handled: Boolean);

begin
 if ssCtrl in Shift then
  if WheelDelta>0 then
   ZoomOut
  else
   ZoomIn;
end;

Тут вместо ZoomOut и ZoomIn должны быть Ваши масштабирующие процедуры.
PM MAIL   Вверх
kozerog
  Дата 2.3.2012, 22:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Спасибо большое, я тоже буду пробовать.
PM MAIL WWW   Вверх
Amalthea
Дата 12.4.2012, 12:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Воспользовалась Вашей библиотекой компонент Image Controls 2.0 (хорошая библиотека, спасибо!), а именно компонентой TScrollingImage. Рисую сетку долгот и широт на карте:
user posted image

Затем начинаю масштабировать картинку, и сетка начинает выглядеть следующим образом (часть линий не прорисовывается):
user posted image
Кто-нибудь знает, как решается данная проблема, есть ли способы?

И еще одна проблема. Когда открываю карту большого размера, например 6521x3261 px, получается такая 'красота' (рис. ниже), линии и цвета искажаются, а если карта размера 3260x1630, то открывается в нормальном виде через раз, если карта такого же размера, но в градациях серого, то все отображается прекрасно.
user posted image

С чем это может быть связано?

И еще один вопрос. Мне на карту нужно наложить некоторые полупрозрачные области (тень на Земле) можно ли установить прозрачность пикселов или таких возможностей нет в Delphi? Нашла только как сделать прозрачной форму.

Спасибо!

Это сообщение отредактировал(а) Amalthea - 12.4.2012, 12:29
PM MAIL   Вверх
Illusion Dolphin
Дата 12.4.2012, 13:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



"часть линий не прорисовывается" - это потому что используется алгоритм Nearest для изменения масштаба. Как писал автор:
Но если нужно качественное, то есть событие OnScaleImage, где можно как угодно масштабировать изображение. Тут я Вам также рекомендую искать слово SmoothResize .
На счёт карты искажённой - тут хорошо бы видеть сам файл, такое ощущение что он не 24 bit RGB. Например, JPEG может быть в CMYK - и делфи до последнего времени это не поддерживало (xe2 - полёт нормальный). 


--------------------
В мире всего две бесконечности: вселенная и человеческая глупость... На счёт вселенной я не уверен.
Шифрование и организация фотографий - Photo Database 4.5
PM MAIL WWW ICQ   Вверх
Amalthea
Дата 13.4.2012, 10:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Illusion Dolphin спасибо, 
поищу событие OnScaleImage.

Насчет карты, она у меня в цветовой модели RGB, 8 bit, с расширением jpg и bmp. Открывала их в фотошопе, тоже часть сетки пропадает при уменьшения масштаба. Если толщину линий делать толще (>1 px), то конечно лучше отображается.

А по поводу полупрозрачных областей. Можно ли установить прозрачность пикселов или таких возможностей нет в Delphi? Нашла только как сделать прозрачной форму. Вы об этом что-нибудь слышали?
PM MAIL   Вверх
Illusion Dolphin
Дата 13.4.2012, 12:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Можно ли установить прозрачность пикселов или таких возможностей нет в Delphi?

Всё можно. Скорее всего Вам надо полупрозрачное рисование. Детальнее опишите задачу я тогда расскажу что надо делать. Если нарисовать на карте что-нибудь полупрозрачное то тут можно или ручками для старых делфи (http://forum.vingrad.ru/topic-28975.html) или через canvas для новых версий делфи. 

P.S. картинка с наклоном - там идёт смещение битов, обычно такое бывает когда 32 битная картинка читается как 24 бита. Возможно где-то не установлен Bitmap.PixelFormat := pf24Bit. 


--------------------
В мире всего две бесконечности: вселенная и человеческая глупость... На счёт вселенной я не уверен.
Шифрование и организация фотографий - Photo Database 4.5
PM MAIL WWW ICQ   Вверх
Amalthea
  Дата 13.4.2012, 14:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Спасибо за помощь!

У меня Delphi 7.0.
Использую компонент TScrollingImage.
Загружаю в него картинку в растровом формате jpg или bmp. Причем проверяла в фотошопе, они у меня RGB, 8 bit. Т.е. мне их перевести в 24 битные? Кстати, можно загружать в Delphi картинки в векторном формате, например cdr?
Рисую сетку долгот и широт таким образом:
       ScrollingImage1.Picture.Canvas.MoveTo(0, Sh);
       ScrollingImage1.Picture.Canvas.LineTo(ScrollingImage1.Picture.Width, Sh);
Затем надо наложить поверх карты полупрозрачную область (тень на Земле). Скорей всего мне нужно полупрозрачное рисование, как вы написали и лучше узнать как это делается через Сanvas для новых версий Delphi.
Если мои картинки не 24 бит, то они не будут нормально отображаться в Delphi 7.0 пока не установлю: Bitmap.PixelFormat := pf24Bit. Так?

Еще вопрос. Откуда вы черпаете столько нужной информации по Delphi. Во всех книжках, что я читала все написано поверхностно, больше для начинающих. Может посоветуете, что почитать? 
PM MAIL   Вверх
Illusion Dolphin
Дата 14.4.2012, 00:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Если надо рисование прозрачное - может быть лучше будет поставить XE2 . 

24 бита это 3 канала (R,G,B) каждый по 8 бит итого 24. 
"Кстати, можно загружать в Delphi картинки в векторном формате, например cdr?" - cdr навряд ли Вы найдёте, но можно поискать на torry.net для начала.
Сетку правильнее будет рисовать в момент OnScaleImage тогда не будет проблем с масштабом. В это событии надо пересчитать координаты и нарисовать часть сетки для текущего масштаба.
Полупрозрачную область можно наложить в том же OnScaleImage. Для XE2 можно загрузить 32 битную картинку в pngimage, к примеру, и потом отрисовать (Canvas.Draw) на изображении сформированном в OnScaleImage  с учётом пересчёта масштаба. 

Чтобы не было проблем с форматом - грузите катинки так:
Код

var
  J: TJpegImage;
  B: TBitmap;
begin
  J := TJpegImage.Create;
  try
   J.LoadFromFile(...);
   B := TBitmap.Create;
   try
     B.Assign(J);
     B.PixelFormat := pf24Bit;
     ...  тут работа с картинкой, она будет точно 24 бита
   finally
     B.Free;
   end;   
  finally
    J.Free;
  end;
end;


Это сообщение отредактировал(а) Illusion Dolphin - 14.4.2012, 09:52


--------------------
В мире всего две бесконечности: вселенная и человеческая глупость... На счёт вселенной я не уверен.
Шифрование и организация фотографий - Photo Database 4.5
PM MAIL WWW ICQ   Вверх
Amalthea
Дата 17.4.2012, 08:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Спасибо за советы!

Но проблему с искаженным отображением картинки так и не удалось решить, ваш пример не помог. Значит дело не в битах? В итоге удалила те карты, что плохо отображались. Теперь проблем нет, а вопрос остается открытым. 
Может это связано с отрисовкой через OpenGL, т.к. я использую компонент TScrollingImage?

В случае масштаба, думаю так оставить (OnScaleImage не использую, т.к. есть OnZoom), тем более, если даже в фотошопе при уменьшении масштаба этой же картинки с сеткой, часть линий тоже как бы исчезает. А куда мне до разработчиков фотошопа smile
PM MAIL   Вверх
bems
Дата 17.4.2012, 09:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

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



почему бы не использовать emf(метафайлы)?
это сохранённая последовательность вызовов функций рисования, то есть по сути вектор


--------------------
Обижено школьников: 8
PM MAIL   Вверх
Amalthea
Дата 18.4.2012, 13:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



У меня есть карты в формате emf. Только как их правильно открывать? Я делала так, но похоже не правильно, они не отображаются.
Код

var  bmp : TBitmap;
      mf    : TMetaFile;

begin

if AnsiLowerCase(ExtractFileExt(PathFileImage)) = '.emf' then
  begin
    mf := TMetaFile.Create;
    try
      mf.LoadFromFile(PathFileImage);
      bmp := TBitmap.Create;
       try
         bmp.Canvas.Draw(0,0,mf);
       finally
         bmp.Free;
       end;
    finally
       mf.Free;
    end;
  end;

.....

PM MAIL   Вверх
bems
Дата 18.4.2012, 19:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

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



Зачем загружать в битмап, это же даст тот же растр

как-то так
Код
procedure TForm8.btnOpenClick(Sender: TObject);
const
  CellSize = 100;
var
  i: Integer;
  Header: TEnhMetaHeader;
  Size: UINT;
  Bits: AnsiString;
begin
  if OpenPictureDialog1.Execute
     then begin
          Image1.Stretch := False;
          Image1.Picture.LoadFromFile(OpenPictureDialog1.FileName);
          if GetEnhMetafileHeader(Image1.Picture.Metafile.Handle, SizeOf(Header), @Header) = 0
             then RaiseLastOsError;

          with TMetaFileCanvas.Create(Image1.Picture.Metafile, 0) do
            try
              Draw(0, 0, Image1.Picture.Metafile);
              Pen.Width := 0;

              for i := 0 to Image1.Picture.Width div CellSize do
                begin
                MoveTo(i * CellSize, 0);
                LineTo(i * CellSize, Image1.Picture.Height - 1);
                end;

              for i := 0 to Image1.Picture.Height div CellSize do
                begin
                MoveTo(0, i * CellSize);
                LineTo(Image1.Picture.Width - 1, i * CellSize);
                end;
            finally
              Free
            end;

          Size := GetEnhMetaFileBits(Image1.Picture.Metafile.Handle, 0, nil);
          if Size = 0 then RaiseLastOsError;

          SetLength(Bits, Size);
          GetEnhMetaFileBits(Image1.Picture.Metafile.Handle, Size, @Bits[1]);
          PEnhMetaHeader(@Bits[1]).szlMillimeters := Header.szlMillimeters;

          Image1.AutoSize := True;
          Image1.Picture.Metafile.Handle := SetEnhMetaFileBits(Size, @Bits[1]);

          Image1.AutoSize := False;
          Image1.Stretch := True
          end;
end;


масштабирование
Код
procedure TForm8.btnZoomInClick(Sender: TObject);
begin
  Image1.SetBounds(Image1.Left, Image1.Top, Round(Image1.Width * 1.1), Round(Image1.Height * 1.1));
end;

procedure TForm8.btnZoomOutClick(Sender: TObject);
begin
  Image1.SetBounds(Image1.Left, Image1.Top, Round(Image1.Width * 0.9), Round(Image1.Height * 0.9));
end;




--------------------
Обижено школьников: 8
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Звук, графика и видео"
Girder
Snowy
Alexeis

Запрещено:

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

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

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

FAQ раздела лежит здесь!


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

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


 




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


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

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