2013-12-03 2 views
1

Дорогой мир стека. Я хотел бы задать вопрос о проблеме, с которой сталкиваюсь с небольшой программой, которую я пишу в R. Я написал код, который позволяет импортировать изображение и управлять им с помощью библиотеки EBImage(). Я использую библиотеку gWidgets(), чтобы пользователь мог выполнять динамические манипуляции. Код этого один:Показать и обрабатывать изображения с gwidgets

library("EBImage") 
library("gWidgets2") 
setwd(choose.dir()) 
imageinput<-file.choose() 
image<-readImage(imageinput) 

##defininig the color mode 
colorimage<-c(Greymode="gray",RGBmode="rgb") 


updateImage <-function (h,...) { 

image1<-((svalue(brightness)+image*svalue(contrast))^(svalue(gamma))) 
image2<-channel(image1,colorimage[svalue(colormode)]) 
display(image2) 
} 

colormode <- gradio(names(colorimage), horizontal=FALSE,handler=updateImage) 
brightness<-gslider(from=-1,to=1,by=.1, value=0,handler=updateImage) 
contrast <- gslider(from=0,to=10,by=.1, value=1,handler=updateImage) 
gamma <- gslider(from=0,to=10,by=0.1, value=1,handler=updateImage) 


window <- gwindow("Image Editing") 


BigGroup <- ggroup(cont=window) 
group <- ggroup(horizontal=FALSE, container=BigGroup) 
tmp <- gframe("Colormode", container=group) 
add(tmp, colormode) 
tmp <- gframe("Brightness", container=group) 
add(tmp, brightness, expand=TRUE) 
tmp <- gframe("Contrast", container=group) 
add(tmp, contrast, expand=TRUE) 
tmp <- gframe("Gamma", container=group) 
add(tmp, gamma, expand=TRUE) 

Но я столкнулся с проблемой (как я писал в предыдущем вопросе, но я решил некоторые вопросы, и я подумал, что было бы хорошо, чтобы перепечатывать новый с лучшим кодом и многим проблемы решены). Проблема в том, что я не могу отобразить в графическом интерфейсе gWidgets, который я создал, и как он динамически редактируется. Хотя есть способ увидеть изображение с функцией display() пакета EBImage, это не тот, который я хочу, потому что он отображается в веб-браузере, а не в графическом интерфейсе.

Я был бы признателен, если бы кто-нибудь знал, что я могу сделать, чтобы решить эту проблему.

+1

Я не уверен, как сделать изображение текущим интерактивным устройством, но если вы можете, вы можете использовать 'ggraphics' с' cairoDevice'. В качестве альтернативы вы можете использовать 'writeImage' для записи в файл изображения и отображения его через' gimage'. Это обычно достаточно отзывчивое, хотя, возможно, и не с большими изображениями. – jverzani

+0

Я использовал gimage, но проблема, как вы сказали, но проблема заключалась в том, что изображение не обновлялось, когда произошли изменения. ggraphics и cairoDevice Я никогда не использовал их раньше. @jverzani Г-н Верзани - это тот, кто связан с написанием gWidgets? – Tony

ответ

1

Сценарий завершен и работает благодаря предложениям Джона Верзани Стефана Лорана. Это было немного сложно, но в конце это сработало! код заключается в следующем:

library("EBImage") 
library("gWidgets2") 
setwd(choose.dir()) 
imageinput<-file.choose() 
image<-readImage(imageinput) 

##defininig the color mode 
colorimage<-c(RGBmode="rgb",Greymode="gray") 


updateImage <-function (h,...) { 
image1<-((svalue(brightness)+image*svalue(contrast))^(svalue(gamma))) 
image2<-channel(image1,colorimage[svalue(colormode)]) 
imageout<-writeImage(image2,"imageout.jpeg") 
svalue(img)<-"imageout.jpeg" 
} 

colormode <- gradio(names(colorimage), horizontal=FALSE,handler=updateImage) 
brightness<-gslider(from=-1,to=1,by=.1, value=0,handler=updateImage) 
contrast <- gslider(from=0,to=10,by=.1, value=1,handler=updateImage) 
gamma <- gslider(from=0,to=10,by=0.1, value=1,handler=updateImage) 


window <- gwindow("Image Editing") 

BigGroup <- ggroup(cont=window) 
group <- ggroup(horizontal=FALSE, container=BigGroup) 
tmp <- gframe("Colormode", container=group) 
add(tmp, colormode) 
tmp <- gframe("Brightness", container=group) 
add(tmp, brightness, expand=TRUE) 
tmp <- gframe("Contrast", container=group) 
add(tmp, contrast, expand=TRUE) 
tmp <- gframe("Gamma", container=group) 
add(tmp, gamma, expand=TRUE) 
img <- gimage(imageinput,container=BigGroup) 

Там должен быть создан новый кадр, который будет содержать графику (gimage), но значение отображаемого изображения должна быть возобновлена ​​после каждого редактирования. Таким образом, значение должно быть в функции.

+1

Вам необходимо обновить изображение, хранящееся в gimage. Если вы создаете виджет с помощью 'img <- gimage (...)', используйте 'svalue (img) <- имя_файла' для обновления виджета. – jverzani

+0

Я не могу понять, как делать то, что вы предлагаете. Может быть, мои знания об этом не так глубоки, поэтому я могу это понять. Если бы вы могли объяснить, как писать код ... потому что я борюсь с текстом через несколько часов ... и google не очень помогает ... информации о gwidgets не так много (кроме ваших pdf-файлов с примерами) в сети, поэтому я могу комбинировать то, что вы предлагаете с любым примером, чтобы увидеть, как это делается. :/ – Tony

+0

Привет, Тони. Когда вы продвигаетесь вперед, но ваша проблема не решена, вы должны отредактировать свой первый вопрос, а не открывать ответ. –