Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / VB : Anti-Aliassing при развороте bitmap / 9 сообщений из 9, страница 1 из 1
15.11.2007, 12:27
    #34941571
P.R.O.M.A.R.K
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
VB : Anti-Aliassing при развороте bitmap
Сделал программу,разворачивает картинку на градусы.
При развороте, качество изображения снижается,но оно востанавливается путем Anti-Aliassing' га.
Как мне сделать Anti-Aliassing (Сглаживание) при развороте изображения?
Заранее спасибо.
...
Рейтинг: 0 / 0
15.11.2007, 15:37
    #34942469
Бенедикт
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
VB : Anti-Aliassing при развороте bitmap
P.R.O.M.A.R.K,
"восстанавливается путём anti-aliasing'а"? Как восстановить потерянную информацию? И зачем, если можно более аккуратно делать само преобразование? Ладно, брюзжу. ;-)

На vbAccelerator ссылки тебе давали уже неоднократно. Там есть и нужный тебе пример , использующий GDI+. Есть и другие примеры (ищи по имени функции GdipRotateWorldTransform, например).

Есть также интересная библиотека, AGG, Anti-Grain Geometry , но пока у меня не дошли до неё руки. Если у тебя вдруг дойдут, поделись, пожалуйста, результатом.
...
Рейтинг: 0 / 0
22.11.2007, 11:23
    #34957557
P.R.O.M.A.R.K
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
VB : Anti-Aliassing при развороте bitmap
Бенедикт,спасибо за ссылку,но это не совсем то...

Вот например:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
Private Declare Function SetPixel Lib "gdi32.dll" _
(ByVal hDC As Long, ByVal X As Long,ByVal Y As Long, ByVal Color As Long) As Long
Private Declare Function GetPixel Lib "gdi32.dll"_
 (ByVal hDC As Long, ByVal X As Long, ByVal Y As Long) As Long
Private Declare Function GetTickCount Lib "kernel32" () As Long
Private Declare Sub InitCommonControls Lib "comctl32.dll" ()
Private Type tRGB
    Red As Long
    Green As Long
    Blue As Long
End Type
Private Function GetRGB(Color As Long) As tRGB
GetRGB.Red = Color And  255 
GetRGB.Green = Int(Color /  256 ) And  255 
GetRGB.Blue = Int(Color /  65536 ) And  255 
End Function
Private Sub Command1_Click()
On Error Resume Next
Dim Bits( 99 ,  99 ) As Long
Dim Rot_Bits( 99 ,  99 ) As Long
Dim For_X, For_Y As Long
Const x0 =  99  /  2 
Const y0 =  99  /  2 
Dim r, SinA, CosA, AlhaSin, AlhaCos As Single
Dim Temp_RGB As tRGB
Dim OldTime, AllTime, X, Y, GrayColor As Long

l_log.Clear
OldTime = GetTickCount
l_log.AddItem "Áóôåðèçàöèÿ èçîáðàæåíèÿ..."
For For_X =  0  To  99 
For For_Y =  0  To  99 
    Bits(For_X, For_Y) = GetPixel(Picture1.hDC, For_X, For_Y)
Next
Next
l_log.AddItem "Áóôåðèçàöèÿ èçîáðàæåíèÿ 100%."
l_log.AddItem "-----------------------------------------------------"
l_log.AddItem "Ðàçâîðîò áóôåðà..."
AlhaSin = Sin(Val(t_deg.Text) *  3 . 14  /  180 )
AlhaCos = Cos(Val(t_deg.Text) *  3 . 14  /  180 )

For For_X =  0  To  99 
For For_Y =  0  To  99 
    X = CInt(x0 + (((For_X - x0) * AlhaCos) - ((For_Y - y0) * AlhaSin)))
    Y = CInt(y0 + (((For_X - x0) * AlhaSin) + ((For_Y - y0) * AlhaCos)))
    Rot_Bits(For_X, For_Y) = Bits(X, Y)
    DoEvents
Next
DoEvents
Next
l_log.AddItem "Ðàçâîðîò áóôåðà 100%."
l_log.AddItem "-----------------------------------------------------"
l_log.AddItem "Îòðèñîâêà áóôåðà..."
Picture2.Cls
For For_X =  0  To  99 
For For_Y =  0  To  99 
    If Check1.Value =  1  Then
        Temp_RGB = GetRGB(Rot_Bits(For_X, For_Y))
        GrayColor = Temp_RGB.Red *  0 . 3  + Temp_RGB.Green *  0 . 59  + Temp_RGB.Blue *  0 . 11 
        SetPixel Picture2.hDC, For_X, For_Y, RGB(GrayColor, GrayColor, GrayColor)
    Else
        SetPixel Picture2.hDC, For_X, For_Y, Rot_Bits(For_X, For_Y)
    End If
Next
Next
l_log.AddItem "Îòðèñîâêà áóôåðà 100%."
l_log.AddItem "-----------------------------------------------------"
AllTime = GetTickCount - OldTime
l_log.AddItem "Çàòðà÷åíî âðåìåíè " & AllTime & " ìèëèñåêóíä."
End Sub

Глянь участок кода:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
For For_X =  0  To  99 
For For_Y =  0  To  99 
    X = CInt(x0 + (((For_X - x0) * AlhaCos) - ((For_Y - y0) * AlhaSin)))
    Y = CInt(y0 + (((For_X - x0) * AlhaSin) + ((For_Y - y0) * AlhaCos)))
    Rot_Bits(For_X, For_Y) = Bits(X, Y)
    DoEvents
Next
DoEvents
Next
Где-то там надо вставить процедуру Anti-Aliassing,иначе все повернутое изображение будет в "зазубренках"
...
Рейтинг: 0 / 0
22.11.2007, 15:41
    #34958776
Бенедикт
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
VB : Anti-Aliassing при развороте bitmap
P.R.O.M.A.R.K,
мама... Это не ужас. Это ужас-ужас-ужас. Признайся - это просто желание такое - всё сделать самому, не обращая внимания на всякие там GDI, GDI+, DirectX, OpenGL, AGG?

Хорошо, вот тебе anti-aliasing при повороте "на пальцах". Возьми или представь прозрачную плёнку. Нарисуй на ней координатные оси и координатную сетку. Каждая клетка (квадратик) сетки - это пиксель исходного изображения. Теперь возьми вторую такую плёнку, или просто листок в клеточку. Это будет результирующее изображение, со своими пикселями-квадратиками. Наложи с поворотом (и возможным смещением) первое на второе. Как видишь, каждый пиксель исходного изображения наложился на несколько пикселей результирующего (в общем случае). Если рассматривать с другой стороны, на пиксель результирующего изображения наложилось, например, 4 пикселя цветов c1, с2, с3, с4 исходного, и каждый покрыл какую-то часть d1, d2, d3, d4 его площади. d1+d2+d3+d4=1. Следовательно, цвет результирующего пикселя должен вычисляться как C = (c1*d1+c2*d2+c3*d3+c4*d4) / (d1+d2+d3+d4) = c1*d1+c2*d2+c3*d3+c4*d4. Поскольку цвет - трёхкомпонентный RGB, это вычисление надо делать для каждой компоненты.

Ну что, сможешь реализовать такой метод? В реальности им в такой редакции вряд ли кто-то пользуется, но некая упрощённая модификация, насколько мне известно, в ходу.
...
Рейтинг: 0 / 0
23.11.2007, 09:42
    #34960192
P.R.O.M.A.R.K
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
VB : Anti-Aliassing при развороте bitmap
БенедиктP.R.O.M.A.R.K,
мама... Это не ужас. Это ужас-ужас-ужас. Признайся - это просто желание такое - всё сделать самому, не обращая внимания на всякие там GDI, GDI+, DirectX, OpenGL, AGG?

Хорошо, вот тебе anti-aliasing при повороте "на пальцах". Возьми или представь прозрачную плёнку. Нарисуй на ней координатные оси и координатную сетку. Каждая клетка (квадратик) сетки - это пиксель исходного изображения. Теперь возьми вторую такую плёнку, или просто листок в клеточку. Это будет результирующее изображение, со своими пикселями-квадратиками. Наложи с поворотом (и возможным смещением) первое на второе. Как видишь, каждый пиксель исходного изображения наложился на несколько пикселей результирующего (в общем случае). Если рассматривать с другой стороны, на пиксель результирующего изображения наложилось, например, 4 пикселя цветов c1, с2, с3, с4 исходного, и каждый покрыл какую-то часть d1, d2, d3, d4 его площади. d1+d2+d3+d4=1. Следовательно, цвет результирующего пикселя должен вычисляться как C = (c1*d1+c2*d2+c3*d3+c4*d4) / (d1+d2+d3+d4) = c1*d1+c2*d2+c3*d3+c4*d4. Поскольку цвет - трёхкомпонентный RGB, это вычисление надо делать для каждой компоненты.

Ну что, сможешь реализовать такой метод? В реальности им в такой редакции вряд ли кто-то пользуется, но некая упрощённая модификация, насколько мне известно, в ходу.
Очень интересно...
Бенедикт,спасибо.
У тебя есть упрошенный алгоритм?
...
Рейтинг: 0 / 0
25.11.2007, 16:06
    #34963724
M.A.R.K
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
VB : Anti-Aliassing при развороте bitmap
Бенедикт... 4 пикселя цветов c1, с2, с3, с4 исходного, и каждый покрыл какую-то часть d1, d2, d3, d4 его площади. d1+d2+d3+d4=1...
Бенедикт,мне не совсем понятно "d1+d2+d3+d4=1",поянсни пожалуйста.
...
Рейтинг: 0 / 0
27.11.2007, 02:23
    #34966862
Бенедикт
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
VB : Anti-Aliassing при развороте bitmap
P.R.O.M.A.R.K,
сейчас попутаюсь ответить на второй вопрос. В силу отсутствия педагогических навыков, рисунком. За единицу принимается площадь пикселя изображения-результата. Его не обязательно покрывают 4 пикселя исходного изображения, это я взял для примера.
...
Рейтинг: 0 / 0
28.11.2007, 02:26
    #34970436
Бенедикт
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
VB : Anti-Aliassing при развороте bitmap
P.R.O.M.A.R.K,
"попутаюсь"
...А теперь на первый.
Один из упрощённых алгоритмов таков, что
1) вычисляется обратное преобразование (из системы координат результирующего изображения в систему координат исходного);
2) пиксель результирующего изображения разбивается на несколько субпикселей (например, 2*2, 4*4, или 8*8);
3) берётся точка (обычно центр) субпикселя, и применяется обратное преобразование (см. пункт 1));
4) если точка попала в какой-то пиксель исходного изображения, цвет субпикселя принимается равным цвету этого пикселя исходного изображения; если не попала (вышли за пределы рисунка), то цвету фона;
5) цвет пикселя результирующего изображения принимается равным среднему цвету его субпикселей (по каждой цветовой компоненте).

Для примерных результатов см. рисунок. Применялся GDI (не GDI+) в ОС с ядром NT. Какой метод использует Photoshop, я не знаю. Рассматривать под микроскопом.
...
Рейтинг: 0 / 0
04.12.2007, 09:53
    #34983994
M.A.R.K
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
VB : Anti-Aliassing при развороте bitmap
Спасибо,Бенедикт.
Попробую это реализовать...
...
Рейтинг: 0 / 0
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / VB : Anti-Aliassing при развороте bitmap / 9 сообщений из 9, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]