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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Определение реальной границы рисунка 
:(
    Опции темы
Святогор
Дата 18.6.2010, 14:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Суть в чём: к примеру, есть белая канва 640х480, пользователь что-нибудь рисует на ней и потом сохраняет в файл. Перед сохранением нужно обрезать канву так, чтобы в файл попали только художества пользователя, а не половина чистого листа канвы.

В векторных рисовалках это называется вроде как Visible bounds.
PM MAIL   Вверх
Bitter
Дата 18.6.2010, 17:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный лентяй
***


Профиль
Группа: Завсегдатай
Сообщений: 1209
Регистрация: 15.8.2004
Где: Харьков, Ukraine

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



когда пользователь нажимает левую кнопку мыши и когда водит по канве (с нажатой кнопкой), запоминаешь текущую координату и сравниваешь её с минимальной. Если она меньше, то минимальной становится текущая. И так для максимальной по Х и минимальной и максимальной по Y. Вот тебе и границы
PM MAIL ICQ Skype   Вверх
AntonN
Дата 19.6.2010, 13:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



При сохранении ищи крайние не белые пиксели слева, справа, снизу и сверху, найдешь прямоугольник по которому можно обрезать. Скопируй канвас на буферный битмап (если он еще не на нем, в чем я сомневаюсь), для быстрого доступа к пикселям воспользуйся scanline().
как пример могу показать эту функцию, довольно неоптимальная местами и без некоторых проверок (пример ищет пиксели которые не "темнее" 4%, тебе надо искать пиксели которые по всем каналам (RGB) не равны 255), передаются в нее битмап с нарисованным и trect который вернет прямоугольник:
Код

procedure GetGrebaniyFontWidth(BT:Tbitmap; var _R:Trect);
const
  MaxPixelCountA = MaxInt div SizeOf(TRGBQuad);
type
  PRGBAArray = ^TRGBAArray;
  TRGBAArray = array[0..MaxPixelCountA-1] of TRGBQuad;
var _x,_y,xm:integer; used:boolean; Row: PRGBAArray;
    w_in,h_in:integer;
    function GetSummColor(r,g,b:integer):byte;
    begin
     result:=trunc((r+g+b)/3);
    end;
begin
   w_in:=BT.Width-1;
   h_in:=BT.Height-1;
   _R.Left:=w_in+1;
   _R.Top:=h_in+1;
   _R.Bottom:=0;
   _R.Right:=0;
   Bt.PixelFormat:=pf32bit;
   for _y:=0 to h_in do begin
      Row:=BT.ScanLine[_y];
      used:=true;
    for _x:=w_in downto 0 do
     if used then begin
      if (GetSummColor(Row[_x].rgbRed,Row[_x].rgbGreen,Row[_x].rgbBlue)>10) then begin
        used:=false;
        if _r.Right<_x then _R.Right:=_x;
      end;
    end;
   end;
   _R.Bottom:=bt.Height-1;
   used:=true;
   for _y:=h_in downto 0 do begin
      Row:=BT.ScanLine[_y];
      if(used) then
      for _x:=w_in downto 0 do begin
        if(used) then
        if (GetSummColor(Row[_x].rgbRed,Row[_x].rgbGreen,Row[_x].rgbBlue)>10) then begin
          if _r.Bottom>_y then _R.Bottom:=_y;
          used:=false;
        end;
      end;
   end;

   _R.Left:=0;
   xm:=w_in+1;
   for _y:=0 to h_in do begin
      Row:=BT.ScanLine[_y];
      used:=true;
      for _x:=0 to w_in do begin
        if(used) then
        if (GetSummColor(Row[_x].rgbRed,Row[_x].rgbGreen,Row[_x].rgbBlue)>10) then begin
            if(xm>_x) then
             xm:=_x;
            used:=false;
        end;
      end;
   end;
   if(xm<=_R.Right) then _R.Left:=xm;

end;




--------------------
user posted image
PM MAIL WWW   Вверх
Святогор
Дата 23.6.2010, 15:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Спасибо, ребята!
PM MAIL   Вверх
Mikel
Дата 23.6.2010, 15:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



не забудь предусмотреть ситуацию когда пользователь ничего не нарисовал smile а то битмапов с 0 размерами вроде как не бывает.


--------------------
...so remember, it's better to burn out than to fade away
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Звук, графика и видео"
Girder
Snowy
Alexeis

Запрещено:

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

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

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

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


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

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


 




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


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

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