Levelup
Фев. 22, 2011 12:52:35
Всем доброго времени суток!
Необходимо реализовать управление яркостью изображения посредством OpenGL. Нашел несколько вариантов на С. Но сделать на питоне так и не получилось. Подскажите, пожалуйста, куда копать. Может кто-нибудь сталкивался с каким-либо подобным примером.
http://stackoverflow.com/questions/1506299/applying-brightness-and-contrast-with-opengl-es - пример на c++, где говорят, что изменение яркости прекрасно работает.
Андрей Светлов
Фев. 22, 2011 13:12:27
А где там С++? :)
Один раз домешивают текстуру на fixed pipeline, второй раз - пиксельным шейдером. С шейдером возни чуть больше.
А что не получилось то?
Levelup
Фев. 22, 2011 13:17:24
Да я вообще в OpenGL полный ноль. Хотелось бы примерчик какой-нибудь поглядеть..
Андрей Светлов
Фев. 22, 2011 13:28:56
Ууу. С примерами я вам не советчик. Может, кто другой подскажет…
Levelup
Фев. 22, 2011 13:38:22
А приведенный код должен помочь и откуда берется переменная brightness? Я так понимаю код необходимо писать в OnPaint, где у меня происходит инициализация opengl? Или я могу создать отдельную функцию, чтоб забиндить слайдер на неё?
Спасибо.
Levelup
Фев. 28, 2011 16:14:40
Ну может хоть кто-то знает где про изменение яркости почитать. Весь гугл перелопатил уже.
Андрей Светлов
Фев. 28, 2011 16:55:50
http://nehe.gamedev.net/Читайте tutorials, пока не придет просветление.
Levelup
Март 1, 2011 18:45:24
Поглядел примеры. К сожалению, там нет того, что мне нужно. Вот рабочий пример изображения, яркость которого необходимо изменить. Оно создается из двумерного массива и похоже, чтобы всё это реализовать необходимо использовать пиксельный шейдер.
import wx
from wx.glcanvas import GLCanvas
from OpenGL.GL import *
from numpy import *
class ButtonPanel(wx.Frame):
def __init__(self, *args, **kwargs):
wx.Frame.__init__(self, *args, **kwargs)
c = MyCanvasBase(self)
class MyCanvasBase(GLCanvas):
_dx = _dy = 0
_image = None
def __init__(self, parent):
GLCanvas.__init__(self, parent)
self.Bind(wx.EVT_PAINT, self.OnPaint)
def OnPaint(self, event):
w = h = 512
i, j = indices()
image = i*j
image = (image*65535.0/image.max()).astype(uint16)
image = 65535
# Calculate the image contrast as 0.8% histogram level
hist = cumsum(histogram(image, 65536, (0, 65536)))
h, w = image.shape
area = w*h
level = 0.008
b = searchsorted(hist, round(level*area))
r = max(searchsorted(hist, round((1.0 - level)*area)) - b, 1)
# Scale image according to brightness and contrast and convert to 16-bit
# unsigned
self._image = ((clip(image, b, b+r) - b)*(65535.0/r)).astype(uint16)
dc = wx.PaintDC(self)
self.SetCurrent()
glEnable(GL_TEXTURE_2D)
glPixelStorei(GL_UNPACK_ALIGNMENT, 1)
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP)
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP)
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR)
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR)
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL)
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, self._image.shape,
self._image.shape, 0, GL_LUMINANCE,
GL_UNSIGNED_SHORT, self._image)
glClear(GL_COLOR_BUFFER_BIT)
glLoadIdentity()
glBegin(GL_QUADS)
glTexCoord2i(0, 1); glVertex2i(-1, -1)
glTexCoord2i(1, 1); glVertex2i( 1, -1)
glTexCoord2i(1, 0); glVertex2i( 1, 1)
glTexCoord2i(0, 0); glVertex2i(-1, 1)
glEnd()
self.SwapBuffers()
app = wx.App(False)
try:
frame = ButtonPanel(None, -1, size=(400,400))
frame.Show(True)
app.MainLoop()
finally:
del app
Андрей Светлов
Март 1, 2011 18:52:22
Очень здорово, что появился пример!
Завтра на него посмотрю внимательно.
Levelup
Март 1, 2011 18:53:42
Заранее спасибо! Жду ответа.