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

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

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

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

Код: 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
VB : Anti-Aliassing при развороте bitmap
    #34958776
Фотография Бенедикт
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
VB : Anti-Aliassing при развороте bitmap
    #34960192
Фотография P.R.O.M.A.R.K
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Бенедикт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
VB : Anti-Aliassing при развороте bitmap
    #34963724
M.A.R.K
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Бенедикт... 4 пикселя цветов c1, с2, с3, с4 исходного, и каждый покрыл какую-то часть d1, d2, d3, d4 его площади. d1+d2+d3+d4=1...
Бенедикт,мне не совсем понятно "d1+d2+d3+d4=1",поянсни пожалуйста.
...
Рейтинг: 0 / 0
VB : Anti-Aliassing при развороте bitmap
    #34966862
Фотография Бенедикт
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
P.R.O.M.A.R.K,
сейчас попутаюсь ответить на второй вопрос. В силу отсутствия педагогических навыков, рисунком. За единицу принимается площадь пикселя изображения-результата. Его не обязательно покрывают 4 пикселя исходного изображения, это я взял для примера.
...
Рейтинг: 0 / 0
VB : Anti-Aliassing при развороте bitmap
    #34970436
Фотография Бенедикт
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
VB : Anti-Aliassing при развороте bitmap
    #34983994
M.A.R.K
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо,Бенедикт.
Попробую это реализовать...
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / VB : Anti-Aliassing при развороте bitmap
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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