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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 18.06.2010, 18:42   #21
nacgull
Пользователь
 
Аватар для nacgull
 
Регистрация: 17.11.2009
Сообщений: 65
По умолчанию

Цитата:
Сообщение от DomiNick Посмотреть сообщение
В сундуке заяц, в зайце утка, в утке яйцо, в яйце сундук.....
Рекурсия? о_О
Матрёшка с двойным дном
CPUcode&Asm1801ВМ1,AsmZ80,Asm xPentiumII, Basic,Pascal,Forth,LSL, Delphi,C++,MySQL; web&game prog-ng,code hacking; DreamWeaver,C++Visual&Builder,Photo shop,3Dmax,GoldWaveEditor,Softice..
nacgull вне форума Ответить с цитированием
Старый 19.06.2010, 13:07   #22
Alex Cones
Trust no one.
Старожил
 
Аватар для Alex Cones
 
Регистрация: 07.04.2009
Сообщений: 6,526
По умолчанию

У меня такой вопрос по коду:
Код:
procedure FVFL_ConvertToBW(Handle: HBITMAP); stdcall;
var x, y: Integer; c: byte; BMP: BITMAP; p1, p2: PRGBTriple;
begin
Windows.GetObject(Handle, SizeOf(Bmp), @BMP);
p1:=BMP.bmBits;
if BMP.bmBitsPixel=24 then
      for y:=0 to BMP.bmHeight-1 do
            begin
            p2:=p1;
            for x:=0 to BMP.bmWidth-1 do
                  begin
                  c:=(p2.rgbtRed+p2.rgbtGreen+p2.rgbtBlue) div 3;
                  p2.rgbtRed:=c;
                  p2.rgbtGreen:=c;
                  p2.rgbtBlue:=c;
                  inc(p2);
                  end;
            Pointer(p1):=Pointer(Integer(p1)+BMP.bmWidthBytes);
            end
else
      MessageBox(0, 'Function works with 24bit bitmaps only!', 'Error', MB_OK);
end;
Как запхнуть всё в матрицу? Поячеечно? А потом снова идти в таких же циклах и присваивать? Какого типа должна быть матрица?
SQUARY PROJECT - НАБОР БЕСПЛАТНЫХ ПРОГРАММ ДЛЯ РАБОЧЕГО СТОЛА.
МОЙ БЛОГ
GRAY FUR FRAMEWORK - УДОБНАЯ И БЫСТРАЯ РАЗРАБОТКА WINAPI ПРИЛОЖЕНИЙ
Alex Cones вне форума Ответить с цитированием
Старый 19.06.2010, 15:08   #23
DomiNick
Студент, не
Старожил
 
Аватар для DomiNick
 
Регистрация: 29.01.2009
Сообщений: 2,067
Лампочка

Хм... А для чего? о__О

Ну например как-нибудь так можно:
Код:
procedure FVFL_ConvertToBW(Handle: HBITMAP); stdcall;
var x, y: Integer; c: byte; BMP: BITMAP; p1, p2: PRGBTriple; Ar: array of array of PRGBTriple;
begin
Windows.GetObject(Handle, SizeOf(Bmp), @BMP);
SetLength(Ar, BMP.bmWidth, BMP.bmHeight); // зададим размер матрице
p1:=BMP.bmBits;
if BMP.bmBitsPixel=24 then
      begin
      // заполним матрицу:
      for y:=0 to BMP.bmHeight-1 do
            begin
            p2:=p1;
            for x:=0 to BMP.bmWidth-1 do
                  begin
                  Ar[x, y]:=p2;
                  inc(p2);
                  end;
            Pointer(p1):=Pointer(Integer(p1)+BMP.bmWidthBytes);
            end;
      // теперь в матрице Ar указатели на каждый пиксель
      // проверка:
      ZeroMemory(Ar[30, 10], 3); // тест1 - сделаем пиксель ч0рным
      Ar[30, 30].rgbtBlue:=255; // тест2 - сделаем
      Ar[30, 30].rgbtGreen:=255; // пиксель
      Ar[30, 30].rgbtRed:=255; // белым =)
      end
else
      MessageBox(0, 'Function works with 24bit bitmaps only!', 'Error', MB_OK);
end;


З.Ы. Вот что нашел... Может добавить в нашу dll (надеюсь никто не обидится)?:
Цитата:
Вася (30.01.10 18:05) [64]

не знаю что делалось через pmullw,но теперь мне удалось сделать нормальный негатив(правда скорость кажется пострадала):

Код:
procedure TForm1.Button3Click(Sender: TObject);
const mask: int64=$FFFFFFFFFFFFFFFF;
var pt: Pointer; c: Integer;
begin
c:=Image1.Picture.Bitmap.Width*Image1.Picture.Bitmap.Height*3 div 8; // pf24bit
pt:=Image1.Picture.Bitmap.ScanLine[Image1.Picture.Bitmap.Height-1];
asm
mov ecx, c
mov esi, [pt]
@@Cycle_1:
 movq xmm0, [esi]
 movq xmm1, mask
 psubb xmm1, xmm0
 movq [esi], xmm1
 add esi, 8
 loop @@Cycle_1
emms
end;
Image1.Repaint;
end;
я так понял что с MMX циклы только на ассемблере через "loop <метка>" можно делать?а то через "for i:=0 to ..." сразу вылетает нафиг...
и почему там xmm0 а не mmx0?
.....
I am the First of Cyber Evolution...
I am the First to Program your Future...
DomiNick вне форума Ответить с цитированием
Старый 19.06.2010, 15:55   #24
Alex Cones
Trust no one.
Старожил
 
Аватар для Alex Cones
 
Регистрация: 07.04.2009
Сообщений: 6,526
По умолчанию

Цитата:
Хм... А для чего? о__О
Как для чего? А как Вы себе представляете исполнение размывания гауссом без матрицы?
Цитата:
Код:
procedure FVFL_ConvertToBW(Handle: HBITMAP); stdcall;
var x, y: Integer; c: byte; BMP: BITMAP; p1, p2: PRGBTriple; Ar: array of array of PRGBTriple;
begin
Windows.GetObject(Handle, SizeOf(Bmp), @BMP);
SetLength(Ar, BMP.bmWidth, BMP.bmHeight); // зададим размер матрице
p1:=BMP.bmBits;
if BMP.bmBitsPixel=24 then
      begin
      // заполним матрицу:
      for y:=0 to BMP.bmHeight-1 do
            begin
            p2:=p1;
            for x:=0 to BMP.bmWidth-1 do
                  begin
                  Ar[x, y]:=p2;
                  inc(p2);
                  end;
            Pointer(p1):=Pointer(Integer(p1)+BMP.bmWidthBytes);
            end;
      // теперь в матрице Ar указатели на каждый пиксель
      // проверка:
      ZeroMemory(Ar[30, 10], 3); // тест1 - сделаем пиксель ч0рным
      Ar[30, 30].rgbtBlue:=255; // тест2 - сделаем
      Ar[30, 30].rgbtGreen:=255; // пиксель
      Ar[30, 30].rgbtRed:=255; // белым =)
      end
else
      MessageBox(0, 'Function works with 24bit bitmaps only!', 'Error', MB_OK);
end;
Тады наверно еще так:

Код:
procedure FVFL_ConvertToBW(Handle: HBITMAP); stdcall;
var x, y: Integer; c: byte; BMP: BITMAP; p1, p2: PRGBTriple; Ar: array of array of PRGBTriple;
begin
Windows.GetObject(Handle, SizeOf(Bmp), @BMP);
SetLength(Ar, BMP.bmWidth, BMP.bmHeight); // зададим размер матрице
p1:=BMP.bmBits;
if BMP.bmBitsPixel=24 then
      begin
      // заполним матрицу:
      for y:=0 to BMP.bmHeight-1 do
            begin
            p2:=p1;
            for x:=0 to BMP.bmWidth-1 do
                  begin
                  Ar[x, y]:=p2;
                  inc(p2);
                  end;
            Pointer(p1):=Pointer(Integer(p1)+BMP.bmWidthBytes);
            end;
      // теперь в матрице Ar указатели на каждый пиксель
      // проверка:
      ZeroMemory(Ar[30, 10], 3); // тест1 - сделаем пиксель ч0рным
      Ar[30, 30].rgbtBlue:=255; // тест2 - сделаем
      Ar[30, 30].rgbtGreen:=255; // пиксель
      Ar[30, 30].rgbtRed:=255; // белым =)

      p1:=BMP.bmBits;
      for y:=0 to BMP.bmHeight-1 do
            begin
            p2:=p1;
            for x:=0 to BMP.bmWidth-1 do
                  begin
                  p2:=Ar[x, y];
                  inc(p2);
                  end;
            Pointer(p1):=Pointer(Integer(p1)+BMP.bmWidthBytes);
            end;
      end
else
      MessageBox(0, 'Function works with 24bit bitmaps only!', 'Error', MB_OK);
end;
Или я опять допускаю ту же ошибку?
SQUARY PROJECT - НАБОР БЕСПЛАТНЫХ ПРОГРАММ ДЛЯ РАБОЧЕГО СТОЛА.
МОЙ БЛОГ
GRAY FUR FRAMEWORK - УДОБНАЯ И БЫСТРАЯ РАЗРАБОТКА WINAPI ПРИЛОЖЕНИЙ
Alex Cones вне форума Ответить с цитированием
Старый 19.06.2010, 16:52   #25
DomiNick
Студент, не
Старожил
 
Аватар для DomiNick
 
Регистрация: 29.01.2009
Сообщений: 2,067
По умолчанию

Цитата:
А как Вы себе представляете исполнение размывания гауссом без матрицы?
Ну... Каким-нибудь более хитрым способом с небывалой оптимизацией (*мечтательно*)...

Кстати никак не могу найти, как размывать Гауссом края изображения (например что с точкой Ar[0,0] делать?)
Цитата:
Или я опять допускаю ту же ошибку?
Эм... Не надо больше делать "p1:=BMP.bmBits;" и.т.п. - теперь все они в матрице...
Теперь просто обращаться к заполненной матрице в цикле:
Код:
      For y:=0 To BMP.bmHeight-1 Do
            For x:=0 To BMP.bmWidth-1 Do
                  Begin
                  Ar[x, y].rgbtBlue:=x;
                  Ar[x, y].rgbtGreen:=x*y;
                  Ar[x, y].rgbtRed:=y;
                  End;
I am the First of Cyber Evolution...
I am the First to Program your Future...
DomiNick вне форума Ответить с цитированием
Старый 19.06.2010, 16:58   #26
Alex Cones
Trust no one.
Старожил
 
Аватар для Alex Cones
 
Регистрация: 07.04.2009
Сообщений: 6,526
По умолчанию

Цитата:
Не надо больше делать
Не буду
Цитата:
например что с точкой Ar[0,0] делать?
Ну наверное брать среднее от окружающих:
http://www.computerra.ru/gid/rtfm/graphic/35934/

в середине:
Код:
1 1 1 1 1
1 1 1 1 1
1 1 1 1 1
1 1 1 1 1
1 1 1 1 1
А если на краю:
Код:
1 1 1 1 1
1 1 1 1 1
1 1 1 1 1
А если на углу:
Код:
1 1 1
1 1 1
1 1 1
SQUARY PROJECT - НАБОР БЕСПЛАТНЫХ ПРОГРАММ ДЛЯ РАБОЧЕГО СТОЛА.
МОЙ БЛОГ
GRAY FUR FRAMEWORK - УДОБНАЯ И БЫСТРАЯ РАЗРАБОТКА WINAPI ПРИЛОЖЕНИЙ
Alex Cones вне форума Ответить с цитированием
Старый 19.06.2010, 17:16   #27
DomiNick
Студент, не
Старожил
 
Аватар для DomiNick
 
Регистрация: 29.01.2009
Сообщений: 2,067
По умолчанию

Так пробовал... Но это слегка замедляет процедуру и не совсем совпадает с работой такого же фильтра в других программах...
На ДелфиВорлд есть какие-то способы ускорения блюра, но там крайние пиксели вообще не стали трогать (получалась незаблюренная рамка)...

Думал что там как-то хитрее делается...
I am the First of Cyber Evolution...
I am the First to Program your Future...
DomiNick вне форума Ответить с цитированием
Старый 19.06.2010, 17:19   #28
Alex Cones
Trust no one.
Старожил
 
Аватар для Alex Cones
 
Регистрация: 07.04.2009
Сообщений: 6,526
По умолчанию

Цитата:
Но это слегка замедляет процедуру
а если асмом?

Цитата:
не совсем совпадает с работой такого же фильтра в других программах
Цитата:
Однако на практике чаще применяется другая разновидность размытия — Gaussian Blur (размытие по Гауссу). В этом случае матрица коэффициентов определяется по довольно сложной формуле нормального распределения Гаусса. Фильтр 3x3 выглядит так (делитель равен 16):
Код:
1 	2 	1
2 	4 	2
1 	2 	1
А фильтр 5x5 с делителем 256:
Код:
1 	4 	6 	4 	1
4 	16 	24 	16 	4
6 	24 	36 	24 	6
4 	16 	24 	16 	4
1 	4 	6 	4 	1
SQUARY PROJECT - НАБОР БЕСПЛАТНЫХ ПРОГРАММ ДЛЯ РАБОЧЕГО СТОЛА.
МОЙ БЛОГ
GRAY FUR FRAMEWORK - УДОБНАЯ И БЫСТРАЯ РАЗРАБОТКА WINAPI ПРИЛОЖЕНИЙ
Alex Cones вне форума Ответить с цитированием
Старый 19.06.2010, 17:45   #29
DomiNick
Студент, не
Старожил
 
Аватар для DomiNick
 
Регистрация: 29.01.2009
Сообщений: 2,067
Лампочка

Цитата:
а если асмом?
Дык всё равно нужно проверять каких "окружающих" не существует... А компилятор вроде и сам неплохо код на асм переводит...
Ну или можно попробовать разделять обработку на несколько циклов разных...
В ДелфиВорлд говорилось про какие-то "двумерные свертки", но я пока не знаком с такими терминами, разбираться надо... Сама статья >вот<...
Цитата:
матрица коэффициентов определяется по довольно сложной формуле нормального распределения Гаусса
Это я знаю... Вот >тут< немного обсуждали...
А в моей любимой программе можно смотреть какой фильтр какую матрицу коэффициентов использует (Custom Filter) - думаю будет полезно при разработке dll...
I am the First of Cyber Evolution...
I am the First to Program your Future...
DomiNick вне форума Ответить с цитированием
Старый 19.06.2010, 21:28   #30
Alex Cones
Trust no one.
Старожил
 
Аватар для Alex Cones
 
Регистрация: 07.04.2009
Сообщений: 6,526
По умолчанию

А не подскажете способ получения этой самой матрицы Гаусса и коэфа на деление?
SQUARY PROJECT - НАБОР БЕСПЛАТНЫХ ПРОГРАММ ДЛЯ РАБОЧЕГО СТОЛА.
МОЙ БЛОГ
GRAY FUR FRAMEWORK - УДОБНАЯ И БЫСТРАЯ РАЗРАБОТКА WINAPI ПРИЛОЖЕНИЙ
Alex Cones вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
DLL-библиотека Lisёноk Помощь студентам 2 29.04.2010 22:00
DLL библиотека Владимир1988 Помощь студентам 1 17.11.2009 17:15
библиотека bass.dll larry Win Api 2 31.07.2009 15:37
Библиотека классов != обычная DLL ? darkstarx Общие вопросы .NET 3 14.04.2008 14:41
HTW32PAS.DLL необходима эта библиотека lekaon Свободное общение 4 21.08.2007 19:14