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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> обрезать картинку по кругу 
V
    Опции темы
Тьма
Дата 23.8.2006, 11:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 339
Регистрация: 22.1.2005
Где: Украина, Винница

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



доброго времени суток

сабж.
картинка квадратная, диаметр круга равен стороне квадрата.
я вижу два решения этой проблемы, и они мне не нравятся:

1 все точки, которые находятся вне круга делать прозрачными путем перебора каждой точки рисунка (хоть рисунок небольшой, но все равно медленный способ)

2 путем перебора каждой линии доходить до первой точки которая принадлежит кругу, и делать тоже самое в обратном направлении в той же линии, всепрйденые точки делать прозрачными(этот способ несколько быстрее т. к. перебираются не все точки)



--------------------
Vir magni ingenii                 
PM MAIL ICQ   Вверх
Alexeis
Дата 23.8.2006, 13:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


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

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



Для рисования непрямоугльных областей, удобно работать с регионами.
Вот пример:
Берем чистый проет бросаем на него кнопку, панельку, а на панельку paintbox. Кидаем Image на форму и грузим в нее картинку.
теперь рисуем
1) создаем регион. Он может быть прямоугольным, эллиптическим, прямоугольником с закруглеными краями или любой комбинацией перечисленных.
пример:
Код

var
  rgn : HRGN;
begin
  rgn := CreateEllipticRgn(0, 0, 100, 100);

2)Устанавливаем область вывода контекста в виде нашего региона
Код

SelectClipRgn(pb1.Canvas.Handle, rgn);
//и сдвигаем ее в нужную позицию
 OffsetClipRgn(pb1.Canvas.Handle, 50, 50);

3)Рисуем в указаной области 
Код

pb1.Canvas.Draw(0,0, img1.Picture.Bitmap);

4)Устанавливаем стандартную область вывода
Код

SelectClipRgn(pb1.Canvas.Handle, 0);

5)Уничтожаем регион
Код

DeleteObject(rgn);


Вот пример целиком
Код

unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    btn1: TButton;
    pb1: TPaintBox;
    img1: TImage;
    pnl1: TPanel;
    procedure btn1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.btn1Click(Sender: TObject);
var
  rgn : HRGN;
begin
  rgn := CreateEllipticRgn(0, 0, 100, 100);
  SelectClipRgn(pb1.Canvas.Handle, rgn);
  OffsetClipRgn(pb1.Canvas.Handle, 50, 50);
  pb1.Canvas.Draw(0,0, img1.Picture.Bitmap);
  SelectClipRgn(pb1.Canvas.Handle, 0);
  DeleteObject(rgn);
end;

end.



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

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

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Тьма
Дата 23.8.2006, 14:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 339
Регистрация: 22.1.2005
Где: Украина, Винница

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



интерестно, спасибо, с меня плюс


Код

SelectClipRgn(pb1.Canvas.Handle, 0);

насколько я понимаю это можно использовать и для невидимых битмапов?

Это сообщение отредактировал(а) Тьма - 23.8.2006, 14:27


--------------------
Vir magni ingenii                 
PM MAIL ICQ   Вверх
Alexeis
Дата 23.8.2006, 15:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


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

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



Цитата(Тьма @  23.8.2006,  14:25 Найти цитируемый пост)
насколько я понимаю это можно использовать и для невидимых битмапов?

Конечно, ведь все графические контексты эквивалентны.

Любопытно, что на компотенте TForm не удается рисовать такие регионы (что-то он блокирует), а вот на KOL форме, легко.

Вот примерчик на KOL (хотя скорее на API вышло smile )

Код

var
  bmp : HBITMAP;
  bmpdc  : HDC;
  rgn : HRGN;
  pDC : HDC;

begin
  pDC := GetDC(form.Handle);

  bmp := Windows.LoadBitmap(HInstance, 'BM1');
  bmpdc := CreateCompatibleDC(pDC);
  SelectObject(bmpdc, bmp);

  rgn := CreateEllipticRgn(0, 0, 100, 100);
  SelectClipRgn(pDC, rgn);
  OffsetClipRgn(pDC, 50, 50);

  BitBlt(pDC, 0, 0, 300, 300,
         bmpdc, 0, 0, SRCCOPY);

  SelectClipRgn(pDC, 0);
  DeleteObject(rgn);
  DeleteObject(bmpdc);
  ReleaseDC(pDC, form.Handle);
  DeleteObject(bmp); 
end;


прикрепляю экзешник (если вдруг KOL не установлено)


Это сообщение отредактировал(а) alexeis1 - 23.8.2006, 15:54

Присоединённый файл ( Кол-во скачиваний: 15 )
Присоединённый файл  test.7z 110,57 Kb


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

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

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


Амеба
Group Icon


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

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



А вот вывод на bitmap
Код

var
  rgn : HRGN;
  b : TBitmap;
begin
  b := TBitmap.Create;
  b.Width := 120;
  b.Height := 120;
  rgn := CreateEllipticRgn(0, 0, 100, 100);
  SelectClipRgn(b.Canvas.Handle, rgn);
  b.Canvas.Draw(0,0, img1.Picture.Bitmap);
  SelectClipRgn(b.Canvas.Handle, 0);
  DeleteObject(rgn);
  Canvas.Draw(10,10, b);
  b.Free
end;



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

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

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Тьма
Дата 23.8.2006, 16:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 339
Регистрация: 22.1.2005
Где: Украина, Винница

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



ну я так и думал, спасибо


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

Запрещено:

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

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

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

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


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

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


 




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


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

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