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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> показ части изображения, чето невыходит :( 
V
    Опции темы
z-END
Дата 2.5.2006, 16:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прафесар™
****


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

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



На форме есть TImage в которую загружена BMP-картинка (большая) TImage.proportional:=true;
нужно чтобы при клике на картинку в другой отображался отцентрированный увеличенный кусок.
Крыша уже едет... и алгоритм неполучается,
какой-то бред придумал, да и он неработает smile
Код

procedure TForm1.PicMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
var nX,nY,aX,aY:Integer;
sy,sx:Real;
begin
sx := Pic.picture.bitmap.width/Pic.width;
sy := Pic.picture.bitmap.height/Pic.height;
Preview.Canvas.FillRect (bounds (0,0,300,300));
SetStretchBltMode(Preview.Canvas.Handle, STRETCH_DELETESCANS);
try
 ax := Abs(Round(Pic.Width*sx-Pic.picture.bitmap.width) div 2);
 aY := Abs(Round(Pic.Height*sy-Pic.picture.bitmap.Height) div 2);
 except 
end;
nX := ax+Round (X*sx);
nY := ay+Round (Y*sy);
Preview.Canvas.CopyRect( bounds(0,0,300,300),Pic.Picture.Bitmap.Canvas, bounds(nX-150,nY-150,150,150));

Как сабж подправить? 


--------------------
Каждый чилавек пасвоему праф...а памоему НЕТ! 

PM WWW ICQ   Вверх
TuXAPuK
Дата 2.5.2006, 18:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Скажи а что ты предусмотрел если nX = -120??
А пробовал через BitBlt, StretchBlt??? 
PM MAIL   Вверх
z-END
Дата 2.5.2006, 18:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прафесар™
****


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

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



дык, проблема не в отрисовке, а в том что немогу просчитать какой кусок нужно показать..
логика такая:
X,Y - координаты на картинке в который воткнули грызуном.
ax,ay - высчитываем реальное начало картинки в TImage;
nY,nX - перемножаем все на все дабы получить координаты X и Y применитьлно к реальным размерам картинки, дабы выдрать оттуда кусок... 
но что-то нетак скалдываю и перемножаю smile 


--------------------
Каждый чилавек пасвоему праф...а памоему НЕТ! 

PM WWW ICQ   Вверх
Alexeis
Дата 3.5.2006, 10:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

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



Если правельно понял то так
Код

procedure TForm1.imgpicMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
var
  nX, nY, aX, aY : Integer;
  sy, sx         : Real;
  minX, minY, MaxX, MaxY : Integer;
  t              : Integer;
begin
  sx := ImgPic.picture.bitmap.width / ImgPic.width;
  sy := ImgPic.picture.bitmap.height / ImgPic.height;
  ImgPreview.Canvas.FillRect (rect(0, 0, ImgPreview.ClientWidth,
                                         ImgPreview.ClientHeight));

  nX := Round (X * sx);
  nY := Round (Y * sy);

  minX := nX - (ImgPreview.ClientWidth div 2);
  minY := nY - (ImgPreview.ClientHeight div 2);
  maxX := nX + (ImgPreview.ClientWidth div 2);
  maxY := nY + (ImgPreview.ClientHeight div 2);

  if minX < 0
  then
    Begin
      minX := 0;
      MaxX := ImgPreview.ClientWidth - 1;
    end;

  if minY < 0
  then
    Begin
      minY := 0;
      MaxY := ImgPreview.ClientHeight - 1;
    end;

  if maxX > (ImgPic.Picture.Bitmap.Width - 1)
  then
    Begin
      MaxX := ImgPic.Picture.Bitmap.Width - 1;
      minX := MaxX - ImgPreview.ClientWidth;
    end;

  if maxY > (ImgPic.Picture.Bitmap.Height - 1)
  then
    Begin
      MaxY := ImgPic.Picture.Bitmap.Height - 1;
      MinY := MaxY - ImgPreview.ClientHeight;
    end;

  ImgPreview.Canvas.CopyRect(Rect(0, 0, ImgPreview.ClientWidth,
                                        ImgPreview.ClientHeight),
                             ImgPic.Picture.Bitmap.Canvas,
                             Rect(minX, MinY, maxX, MaxY));
end;
  

Это сообщение отредактировал(а) alexeis1 - 3.5.2006, 10:34


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
z-END
Дата 3.5.2006, 11:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прафесар™
****


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

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



alexeis1, пасиб... сам разобрался.даж немного проще:
Код

var 
   CW, CH, nX, nY: Integer;
   Delta, aX, aY: Real;
begin
CW := Preview.ClientWidth;
CH := Preview.ClientHeight;
Preview.Canvas.FillRect (bounds (0, 0, CW, CH));
SetStretchBltMode(Preview.Canvas.Handle, STRETCH_DELETESCANS);

//определяем большую сторону заполненную на 100%
if (Pic.picture.bitmap.width / Pic.width) > (Pic.picture.bitmap.height / Pic.height)
 then
    begin
     //Высчитываем коэффицент уменьшения (реальное содеражание точек изображения в 1 пикселе)
     Delta := Pic.picture.bitmap.width / Pic.width;
     //высчитываем отступ от края (на меньшей стороне, большая-100% размера TImage)
     aX := (CW / 2);
     aY := (CH / 2) + ( (Pic.Height*Delta) - Pic.picture.bitmap.height) / 2;
    end
  else
    begin
      Delta := Pic.picture.bitmap.height / Pic.height;
     //высчитываем отступ от края (на меньшей стороне, большая-100% размера TImage)
     aY := (CW / 2);
     aX := (CH / 2) + ( (Pic.Width*Delta) - Pic.picture.bitmap.width) / 2;
    end;

//пересчитываем координаты курсора в координаты изобрадения
nX:=Round ((X * Delta) - aX );
nY:=Round ((Y * Delta) - aY );

Preview.Canvas.CopyRect( bounds (0, 0, CW, CH), Pic.Picture.Bitmap.Canvas, bounds (nX, nY, CW, CH) );
 


--------------------
Каждый чилавек пасвоему праф...а памоему НЕТ! 

PM WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Звук, графика и видео"
Girder
Snowy
Alexeis

Запрещено:

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

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

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

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


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

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


 




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


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

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