XGM Forum
Сайт - Статьи - Проекты - Ресурсы - Блоги

Форуме в режиме ТОЛЬКО ЧТЕНИЕ. Вы можете задать вопросы в Q/A на сайте, либо создать свой проект или ресурс.
Вернуться   XGM Forum > Общение> Hard & Soft
Ник
Пароль
Войти через VK в один клик
Сайт использует только имя.

Ответ
 
DFlyer
<3 MJ
offline
Опыт: 42,879
Активность:
Делаю курсовую, нужна ваша помощь. )
Имеется битмап-картинка (bmp). Нужно сделать два преобразования попиксельно:

1. Повернуть (наклонить) на угол fi, который вводится в поле edit.
Может у кого есть готовый алогритм? Можно тормозной, но чтоб не очень громоздкий и чтоб работал. В инете нашёл пару вариантов, но либо не работает, либо как-то коряво.

2. Масштабировать изображение на mX, nY (m и n вводятся в edit, причём m!=n).
Я пытался делать что-то типа этого:
» Code

Image1 - исходное изображение
Image2 - результат
Код:
procedure TMainForm.ButImgScaleClick(Sender: TObject);
var
  i,j,i2,j2,mX,nY,x,y: integer;
  c: TColor;
begin
    mx:=StrToInt(EditScMX.Text);
    ny:=StrToInt(EditScNY.Text);
    x:=Image2.Left;
    y:=Image2.Top;
    Image2.Width:=Image1.Width*mx;
    Image2.Height:=Image1.Height*ny;
    for j:=1 to Image1.Height do
      for i:=1 to Image1.Width do
        begin
          c:=Canvas.Pixels[i,j];
          Canvas.Pixels[i,j]:=clWhite;
          for j2:=1 to nY do
            for i2:=1 to mX do
              Canvas.Pixels[x+i*i2,y+j*j2]:=c;
        end;
end;

Знаю, что намудил. Надеюсь на вашу помощь).

PS: нужно обойтись без OpenGL и DirectX.
Старый 05.01.2009, 10:56
NETRAT

offline
Опыт: 83,712
Активность:
бред какой-то, почему бы просто не использовать стандартные методы - ручками писать это геморр и далеко не оптимально

по идее тебе нужно брать итоговый канвас(то есть такой который получается после преобразования) и перебирая все его точки, определять какая из точек исходного канваса попадет в текущую. Нужно записать пару формул, обратных тем преобразованиям которые делаешь и по ним определять нужную точку. Готовых алгоритмов у меня нет, ибо это бред, то что можно написать ручками "попиксельно" - это, максимум, линейный алгоритм ресамплинга, качество настолько говневое что такая реализация имеет чисто геморройный характер, никакого реального применения.
http://ru.wikipedia.org/wiki/Цифровая_обработка_изображений

Естественно, что если пытаться что-то нормальное делать (бикубический), то есть добавлять сплайны для рассчета пикселя, то с учетом того что используется дельфийская канва, это будет жестоко лагать
Старый 05.01.2009, 11:08
ShadoW DaemoN

offline
Опыт: 37,078
Активность:
Насчет "повернуть" - нашел у себя на винте функцию. В аттач прицепил пример.
Вообще не рекомендую использовать свойство Pixels, ибо тормозит жутко. Лучше использовать ScanLine[Row] (свойство TBitmap), которое возвращает для "строки" изображения указатель на массив сырых данных вида [BGRABGRA...BGRA] длиной Bitmap.Width * 4 (если картинка 32 битная) или [BGRBGR...BGR] длиной Bitmap.Width * 3 (если картинка 24 битная)
Прикрепленные файлы
Тип файла: rar BitmapRotate.rar (15.8 Кбайт, 29 просмотров )
Старый 05.01.2009, 11:56
DFlyer
<3 MJ
offline
Опыт: 42,879
Активность:
Цитата:
никакого реального применения

Ни о каком реальном применении речи не идёт. Тема курсовой - это "ООП". Т.е. просто показать что такое.
Цитата:
почему бы просто не использовать стандартные методы

Какие?
Старый 05.01.2009, 12:00
NETRAT

offline
Опыт: 83,712
Активность:
Операции типа *Blt обьекта Device Context
Старый 05.01.2009, 12:21
Scorched

offline
Опыт: 7,912
Активность:
Второй пункт можно сделать с помощью TCanvas.CopyRect например. Для курсача думаю сойдет =)
Цитата:
Сообщение от NT
далеко не оптимально

ну дельфи - это вообще не оптимально
Старый 05.01.2009, 13:24
DFlyer
<3 MJ
offline
Опыт: 42,879
Активность:
Цитата:
TCanvas.CopyRect

Можно подробней, пожалуйста?
Старый 05.01.2009, 13:34
NETRAT

offline
Опыт: 83,712
Активность:
Цитата:
ну дельфи - это вообще не оптимально
дезинфа, оптимальность прямо пропорциональна углу кривизны рук
Старый 05.01.2009, 13:42
Scorched

offline
Опыт: 7,912
Активность:
Цитата:
Сообщение от DFlyer
Можно подробней, пожалуйста?

ну там указывается рект-источник(TRect), рект-приемник и канва-источник - не помню в каком порядке =\
работает так - из канвы-источника вырезается кусок, обрамленный рект-источником и вставляется в рект-приемник канвы-приемника(той, что вызывает метод). в зависимости от полей ректов картинка может копироваться с увеличением/уменьшением =)
ну в хелпе ты яснее прочитаешь =\
Scorched добавил:
Цитата:
Сообщение от NETRAT
дезинфа, оптимальность прямо пропорциональна углу кривизны рук

единственный плюс дельфи - быстрая разработка интерфейса. если не пользоваться его неоптимальными компонетами, то от быстрой разработки, равно как и от дельфимало что остается
Цитата:
ты таки-не поверишь на чем и как написан MdlVis

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

Отредактировано Scorched, 05.01.2009 в 17:02.
Старый 05.01.2009, 13:46
NETRAT

offline
Опыт: 83,712
Активность:
Цитата:
единственный плюс дельфи - быстрая разработка интерфейса. если не пользоваться его неоптимальными компонетами, то от быстрой разработки, равно как и от дельфи мало что остается

размер приложения, ровно как и быстродействие, уже давно не настолько критичны - критичны человеко-часы а не машино-часы
учитывая интересы заказчика, сначала задача должна решаться хоть как-то, а потом уже можно пытаться оптимизировать какие-то ее части, путем замены составляющих решение модулей / компонентов (вот почему ООП так модно) на оптимизированные.
типичный пример - delphi интерфейс в связке с набором dll написанных на asm или C

ты таки-не поверишь на чем и как написан MdlVis, так что это не такое уж и уг как некоторые несведущие люди говорят
Старый 05.01.2009, 14:09
DFlyer
<3 MJ
offline
Опыт: 42,879
Активность:
Ладно, давайте обсуждать не "Дельфи гавно/круто", а сабж).
Вопросы всё ещё в силе.
Старый 05.01.2009, 14:13
Ответ

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы можете скачивать файлы

BB-коды Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход



Часовой пояс GMT +3, время: 08:59.