Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 20.10.2010, 10:47   #1
Tronix
Форумчанин
 
Аватар для Tronix
 
Регистрация: 15.06.2010
Сообщений: 740
По умолчанию Выделение толстой рамкой части изображения

Привет, столкнулся казалось бы с ерундой, но не очень понимаю как лучше сделать.
На форме есть Image1 (картинка), нужно сделать чтобы мышкой можно было выделять ее часть. С помощью DrawFocusRect сделал выделение, но слишком тонкая линия получается. Хочется, чтобы можно было выделять потолще и наверное даже лучше не XOR'ить цвета, а рамку рисовать одним цветом.

Решение в лоб - сохранять исходное изображение, на нем рисовать толстый прямоугольник и если мышка сдвинулась - восстанавливать старое и рисовать новый прямоугольник. Но мне кажется, что это не совсем оптимально в плане скорости. Может еще идем будут?
Чтобы понять рекурсию, сперва нужно понять рекурсию.
Tronix вне форума Ответить с цитированием
Старый 20.10.2010, 11:31   #2
psycho-coder
Участник клуба
 
Аватар для psycho-coder
 
Регистрация: 06.04.2009
Сообщений: 1,524
По умолчанию

А Вы пробовали установить значения Brush (или как то так) потолще?
psycho-coder вне форума Ответить с цитированием
Старый 20.10.2010, 11:44   #3
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Я бы попробовал что-то вроде такого:
Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs;

type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
    procedure FormPaint(Sender: TObject);
    procedure FormMouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
    procedure FormMouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure FormMouseUp(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var  b:TBitmap;r:TRect;
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
 b:=TBitmap.Create;
 b.LoadFromFile('C:\stasya_ru_2_big.bmp');
  DoubleBuffered:=true;
end;

procedure TForm1.FormPaint(Sender: TObject);
begin
 BitBlt(Canvas.Handle,0,0,Width,Height,b.Canvas.Handle,0,0,SRCCOPY);
 BitBlt(Canvas.Handle,r.Left,r.Top,r.Right-r.Left,r.Bottom-r.Top,b.Canvas.Handle,r.Left,r.Top,SRCINVERT);
end;

procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
 r.Bottom:=y;r.Right:=x;
 if tag=1 then
  Repaint;
end;

procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
 tag:=1;
 r.Top:=y;r.Left:=x;
end;

procedure TForm1.FormMouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
 
 tag:=0;
end;

end.
Ну это несовершенный код, но... От него можно оттолкнуться
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 20.10.2010, 11:56   #4
Tronix
Форумчанин
 
Аватар для Tronix
 
Регистрация: 15.06.2010
Сообщений: 740
По умолчанию

Цитата:
Сообщение от psycho-coder Посмотреть сообщение
А Вы пробовали установить значения Brush (или как то так) потолще?
А вроде не работает этот метод в DrawFocusRect на сколько я понял (
Чтобы понять рекурсию, сперва нужно понять рекурсию.
Tronix вне форума Ответить с цитированием
Старый 20.10.2010, 12:06   #5
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

тут помоему TPaintBox+TBitMap подходят.

хотя попробуйте у Pen изменить толщину(карандаш рисует рамку)
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 20.10.2010, 13:13   #6
Tronix
Форумчанин
 
Аватар для Tronix
 
Регистрация: 15.06.2010
Сообщений: 740
По умолчанию

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
тут помоему TPaintBox+TBitMap подходят.

хотя попробуйте у Pen изменить толщину(карандаш рисует рамку)
Как я понимаю, в данном случае это не работает
Чтобы понять рекурсию, сперва нужно понять рекурсию.
Tronix вне форума Ответить с цитированием
Старый 20.10.2010, 22:35   #7
dmitriegorovih
Ещё не
Форумчанин
 
Аватар для dmitriegorovih
 
Регистрация: 04.01.2010
Сообщений: 517
По умолчанию

Цитата:
нужно сделать чтобы мышкой можно было выделять ее часть
Вот так?
Код:
  po:Tpoint;
  b:boolean;
implementation

{$R *.dfm}

procedure TForm1.Image2MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
b:=true;
po.X:=x;
po.Y:=y;
end;

procedure TForm1.Image2MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
if b=true then begin
image2.Picture:=nil;
image2.Canvas.Pen.Width:=5; // Размер рамки
image2.Canvas.Pen.Color:=clblue; //Цвет рамки
image2.Transparent:=true;
image2.Picture.Bitmap.TransparentColor:=clwhite;
image2.Picture.Bitmap.Transparent:=true;
image2.Canvas.MoveTo(po.X,po.Y);
image2.Canvas.LineTo(x,po.Y);
image2.Canvas.MoveTo(x,po.Y);
image2.Canvas.LineTo(x,Y);
image2.Canvas.MoveTo(x,Y);
image2.Canvas.LineTo(po.X,Y);
image2.Canvas.MoveTo(po.X,Y);
image2.Canvas.LineTo(po.X,po.Y);
end;
end;

procedure TForm1.Image2MouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
b:=false;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
form1.DoubleBuffered:=true;
end;
Воображение важнее, чем знания. (Albert Einstein)
dmitriegorovih вне форума Ответить с цитированием
Старый 20.10.2010, 23:22   #8
Tronix
Форумчанин
 
Аватар для Tronix
 
Регистрация: 15.06.2010
Сообщений: 740
По умолчанию

dmitriegorovih Спасибо, на пустой картинке работает. А вот если я загружаю из битмапа картинку например, то получается непрерывная закраска ((
Чтобы понять рекурсию, сперва нужно понять рекурсию.
Tronix вне форума Ответить с цитированием
Старый 21.10.2010, 00:07   #9
DomiNick
Студент, не
Старожил
 
Аватар для DomiNick
 
Регистрация: 29.01.2009
Сообщений: 2,067
По умолчанию

Цитата:
С помощью DrawFocusRect сделал выделение
Как именно?
Цитата:
но слишком тонкая линия получается
Ну сделайте несколько DrawFocusRect рядом...
I am the First of Cyber Evolution...
I am the First to Program your Future...
DomiNick вне форума Ответить с цитированием
Старый 21.10.2010, 19:33   #10
dmitriegorovih
Ещё не
Форумчанин
 
Аватар для dmitriegorovih
 
Регистрация: 04.01.2010
Сообщений: 517
По умолчанию

Цитата:
то получается непрерывная закраска ((
это как? попробуйте в image1 залить свою картинку а image2 поверх него и всё нужный участок картинки копировать надо?
Воображение важнее, чем знания. (Albert Einstein)
dmitriegorovih вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Сохранение части изображения из TImage в файл *.bmp ImmortalAlexSan Общие вопросы Delphi 15 02.08.2010 13:00
показ части изображения TDrive PHP 4 22.07.2009 17:36
Показ части изображения Alex Cones Мультимедиа в Delphi 3 12.06.2009 22:15
Выделение и копирование части документа на основе структуры файла satyr_of_frost Microsoft Office Word 23 12.02.2009 09:15
Выделение части изображения Luboff Помощь студентам 1 26.11.2007 08:07