Страница: 1 |
Страница: 1 |
Вопрос: Фильтрация
Добавлено: 12.12.05 23:46
Автор вопроса: Gogic
Если у кого есть примеры функций, реализующих (билинейную, трилинейную etc.) фильтрацию растра при изменении размера, поделитесь, плиз, или киньте линк.
Заранее благодарен.
Ответы
Всего ответов: 9
Номер ответа: 1
Автор ответа:
Страшный Сон
Вопросов: 46
Ответов: 848
Профиль | | #1
Добавлено: 13.12.05 16:40
Что-то сделать пытался. Но функция еще сырая.
Номер ответа: 2
Автор ответа:
AgentFire
ICQ: 192496851
Вопросов: 75
Ответов: 3178
Профиль | | #2
Добавлено: 14.12.05 20:31
Это всмысле? Сглаживание чтоль? ;/
Номер ответа: 3
Автор ответа:
GSerg
Вопросов: 0
Ответов: 1876
Профиль | | #3
Добавлено: 15.12.05 05:19
http://alglib.sources.ru/interpolation/bilinearresample.php
Номер ответа: 4
Автор ответа:
Victor
ICQ: 345743490
Вопросов: 42
Ответов: 385
Web-сайт:
Профиль | | #4
Добавлено: 16.12.05 23:21
Dim InData() As RGBQUAD
Dim OutData() As RGBQUAD
Dim OldW As Long, OldH As Long 'Size of the Data
Dim InX As Double, InY As Double 'Coordinates of New pixel in old-pixels
Dim dx As Double, dy As Double 'offsets from x,y to inx,iny
Dim r As Byte, g As Byte, B As Byte 'accumulators
Dim X As Long, Y As Long 'loop variables in GetColor
Dim x1 As Long, y1 As Long 'coords of surrounding pixels
Dim x2 As Long, y2 As Long
Dim x3 As Long, y3 As Long
Dim x4 As Long, y4 As Long
Dim MaxX As Long, MaxY As Long 'old-data related
Dim MeEn As Boolean
Dim rgb1 As RGBQUAD, rgb2 As RGBQUAD
Dim rgb3 As RGBQUAD, rgb4 As RGBQUAD
ReDim OutData(0 To NewW - 1, 0 To NewH - 1)
OldW = UBound(Data, 1) + 1
OldH = UBound(Data, 2) + 1
MaxX = OldW - 1
MaxY = OldH - 1
For OutY = 0 To NewH - 1
ShowProgress OutY / NewH * 100, Not MeEn
InY = (OutY + 0.5) * OldH / NewH
y1 = Int(InY - 0.5 + 0.00001)
dy = InY - y1 - 0.5
If y1 < 0 Then
If TexMode Then
y1 = MaxY
Else
y1 = 0
End If
End If
y2 = y1
y3 = y1 + 1
If y3 > MaxY Then
If TexMode Then
y3 = 0
Else
y3 = MaxY
End If
End If
y4 = y3
For OutX = 0 To NewW - 1
InX = (OutX + 0.5) * OldW / NewW
x1 = Int(InX - 0.5 + 0.00001)
dx = InX - x1 - 0.5
If x1 < 0 Then
If TexMode Then
x1 = MaxX
Else
x1 = 0
End If
End If
x2 = x1 + 1
If x2 > MaxX Then
If TexMode Then
x2 = 0
Else
x2 = MaxX
End If
End If
x3 = x1
x4 = x2
rgb1 = InData(x1, y1)
rgb2 = InData(x2, y2)
rgb3 = InData(x3, y3)
rgb4 = InData(x4, y4)
OutData(OutX, OutY).rgbRed = ((CDbl(rgb2.rgbRed) - rgb1.rgbRed) * dx + rgb1.rgbRed) * (1# - dy) + ((CDbl(rgb4.rgbRed) - rgb3.rgbRed) * dx + rgb3.rgbRed) * dy
OutData(OutX, OutY).rgbGreen = ((CDbl(rgb2.rgbGreen) - rgb1.rgbGreen) * dx + rgb1.rgbGreen) * (1# - dy) + ((CDbl(rgb4.rgbGreen) - rgb3.rgbGreen) * dx + rgb3.rgbGreen) * dy
OutData(OutX, OutY).rgbBlue = ((CDbl(rgb2.rgbBlue) - rgb1.rgbBlue) * dx + rgb1.rgbBlue) * (1# - dy) + ((CDbl(rgb4.rgbBlue) - rgb3.rgbBlue) * dx + rgb3.rgbBlue) * dy
'OutData(OutX, OutY).rgbRed = r
'OutData(OutX, OutY).rgbGreen = g
'OutData(OutX, OutY).rgbBlue = B
Next OutX
Next OutY
Это вроде билинейная интерполяция.
Номер ответа: 5
Автор ответа:
AgentFire
ICQ: 192496851
Вопросов: 75
Ответов: 3178
Профиль | | #5
Добавлено: 19.12.05 21:42
Какие страшные слова
так это сглаживание или что?
Номер ответа: 6
Автор ответа:
Victor
ICQ: 345743490
Вопросов: 42
Ответов: 385
Web-сайт:
Профиль | | #6
Добавлено: 20.12.05 19:04
Растягивание/сжимание рисунка.
Линейная интерполяция - это когда считаеся, что цвет от пикселя к пикселю меняется линейно.
Би- - то есть по двум направлениям (по иксу и игреку).
У меня есть еще один метод фильтрации - на основе площадей. Он крут для вписывания в меньшие размеры.
А этот как-раз лучше годится для растяжения.
Номер ответа: 7
Автор ответа:
AgentFire
ICQ: 192496851
Вопросов: 75
Ответов: 3178
Профиль | | #7
Добавлено: 21.12.05 21:09
А, все ясно, thx.
А трилинейная – это по X, Y и Z да?
Номер ответа: 8
Автор ответа:
Victor
ICQ: 345743490
Вопросов: 42
Ответов: 385
Web-сайт:
Профиль | | #8
Добавлено: 22.12.05 16:11
Без понятия. Думаю что да, но как можно фильтровать картинку по z я не знаю...
PS. На ссылке от GSerg написано подробнее, советую заглянуть.
Номер ответа: 9
Автор ответа:
Страшный Сон
Вопросов: 46
Ответов: 848
Профиль | | #9
Добавлено: 23.12.05 12:22
Трилинейная фильтрация - это когда помимо интерполяции по иксу и игреку, идет интерполяция между двумя mip-картами.