2009-12-22 3 views
1

Я работаю над применением художественных эффектов для изображения. Не могли бы вы рассказать мне, как достичь этого эффекта?Применение эффектов к изображению с помощью VC++?

Любые входы оценены .....

входного изображения: alt text http://www.flickr.com/photos/vineet_aggarwal/4205359333/

Выход Изображение: alt text http://www.flickr.com/photos/vineet_aggarwal/4205359335/,

+0

Aw cute koala! :) – martinr

ответ

0

Коала на втором изображении является 3D-изображение ... компьютер не может легко работать с вашего первого изображения, какие биты должны быть подняты, а какие бит должны быть опущены.

Я предлагаю> Человек <, чтобы сделать работу, хотя компьютер может помочь ...

Если у вас есть список высот всех плиток, (созданный с помощью графического художника ... может быть?) вы можете визуализировать их в пустой буфер кадра по одному. Выполните их с помощью сглаживания в последовательности от самых последних плиток до фронтальной. По-видимому, значение цвета, выбранное для каждой плитки, основывается на средних значениях цвета в соответствующем квадратном прямоугольнике (который может или не может падать на точные границы пикселей). Но, как вычисляется среднее значение, мне не ясно, он может быть основан на RGB или HSV, это может быть просто среднее или взвешенное среднее, нелинейное или любое другое, и вам может потребоваться рассмотреть гамма-коррекцию (см. Ссылки).

Предположительно, плитка (перед визуализацией) на холсте имеет свое цветовое пространство, искаженное, чтобы соответствовать цвету соответствующей области в исходном изображении.

Я игнорирую тонкости. Я думаю, вы, вероятно, не заботитесь о том, хотите ли вы, чтобы тени или блики были исправлены, чтобы быть темнее или легче на более темных или более светлых плитах, чем какая-либо эталонная плитка после деформирования цвета, и отражение в сцене. OTOH Если эти мелкие детали важны, вы должны подумать о том, чтобы собрать все это в 3D, используя OpenGL. OTOOH (три руки - whoopee), возможно, вы вообще не должны использовать VC++ и делаете это с помощью чертежного пакета ...

Вот иллюстрация кода, я не думал об этом полностью, это всего лишь приблизительный эскиз , вам нужно, чтобы справиться с этим, исправить любые проблемы и ошибки, которые я, возможно, сделал и сделать это самостоятельно: -

int input_width, input_height, tile_width, tile_height; 
int heights_width, heights_height, err=0, height, x, y; 
char* input_pixels=NULL, *output_pixels=NULL, *tile_pixels=NULL; 

char* modified_tile=NULL; int *heights_data=NULL; 

if (!err) err =my_jpeg_read_func("koala.jpg",&width,&height,&input_pixels); 
if (!err) err =my_png_read_func("ref-tile.png",&width,&height,&tile_pixels); 
if (!err) err =my_read_tile_heights_func("tile-heights.csv", 
    &heights_width,&heights_height,&heights_data); 
if (!err) err =(output_pixels = malloc(input_width*input_height*3))==NULL; 
if (!err) err =(modified_tile = malloc(tile_width*tile_height*4))==NULL; 
if (!err) for (height=0; height<256; height++) for (x=0; x < heights_width; x++) 
    for (y=0; y<heights_height; y++) if (heights_data[y*heights_width+x]==height) { 
    int colorvalue = grabcolorvalue(input_pixels, input_widthh, input_height, 
    heights_width, heights_height, x, y); 
    create_colored_tile_by_color_space_warping(tile_pixels, modified_tile, 
    tile_height, tile_width, colorvaLue); 
    draw_tile(output_pixels, input_width, input_height, x, y, heights_width, 
    heights_height, modified_tile, tile_width, tile_height); 
} 
if (!err) err=my_jpeg_wrapper_write("koala-out.jpg", output_pixels, 
    input_width, input_height); 
if (input_pixels) free(input_pixels); input_pixels=NULL; 
if (output_pixels) free(output_pixels); output_pixels=NULL; 
if (tile_pixels) free(tile_pixels); tile_pixels=NULL; 
if (modified_tile) free(modified_tile); modifie_tile=NULL; 
if (err) report_error_to_user(err); 

библиотека JPEG не обязательно даст вам данные в RGB, это может быть в ВПГ или что-то еще, я забыл сейчас. Но преобразование цветового пространства, в котором вы нуждаетесь, в основном связано с математикой с небольшим количеством прогиба и округления и другими клопами, где это необходимо.

Существует много вопросов округления и масштабирования и позиционирования, о которых я не упоминал.

В приведенных выше 3 байтах на пиксель для основных пиксельных буферов, но 4 байта (RGBA) для фрагментов.

Читайте о:

http://en.wikipedia.org/wiki/Anti-aliasing

И

http://en.wikipedia.org/wiki/Alpha_compositing

И

http://en.wikipedia.org/wiki/Color_space

И

http://en.wikipedia.org/wiki/Libjpeg

И

http://en.wikipedia.org/wiki/Libpng

И

http://en.wikipedia.org/wiki/Zlib (так как Libpng использует Zlib)

И

http://en.wikipedia.org/wiki/Gamma_correction

IMHO Использование C++ в порядке, но вы будете работать на низкоуровневом уровне и не используете полиморфизм, поэтому, возможно, концепции OO и инкапсуляция не помогут вам в реализации концепций C и инкапсуляции. Не стесняйтесь писать методы как функции в пространстве имен и/или методах на C++-объекте и включать пиксельные буферы в качестве переменных-члена (или что-то еще), если вы хотите сделать код более согласованным по форме с другим C++, который у вас есть , Лично я бы попытался написать его в чистом C для максимального повторного использования. Вы можете заставить большинство модулей C работать с C++, используя extern «C» условно с инструкциями препроцессора в заголовках.

EDIT

my_jpeg_read_func, my_png_read_func, grabcolorvalue, create_colored_tile_by_color_space_warping, draw_tile, my_jpeg_wrapper_write и report_error_to_user и, возможно, некоторые другие должны быть написаны самостоятельно, и вы, возможно, потребуется включить libjpg, Zlib и Libpng в проекте и добавить заголовки и/или #includes.

EDIT

Хотя это может быть сделано в OpenGL, я предположил бы, что рендеринга закругленной выделены формы верхушек плитки также может быть крохотный немного трудно сделать убедительно. Все программисты OpenGLers или Direct3D получили ответ?

EDIT

Измененное реф-tile.jpg по реф-tile.png.

1

Пожалуйста, см: http://www.codeproject.com/KB/graphics/CBitmapEx.aspx?msg=3312512#xx3312512xx

PS: Вы должны сначала понять класс CBitmapEx написанный автором.

+0

Эй, чтобы вытащить изображение, не сеяя его, нужно исправить общий оттенок и яркость в соответствии с предварительно выбитой плиткой (то есть одним плоским цветом), насколько это возможно для данного цвета плитки.Может быть желательно смешать в некотором плоском цвете, чтобы получить более близкое совпадение цветов, но это, пожалуй, компромисс. Очевидно, что существуют фундаментальные ограничения для цветов, близких к краю цветового спектра, - вы не можете выделить белую черепицу, не сеяя ее, и вы не можете очертить черную плитку, не сеяя ее. Это зависит от того, как вы хотите, чтобы изображение выглядело. – martinr

+0

Если бы это был я, я бы пошел на компромиссы на белых, близких к черным, черных и близких к черным плитках, а не на других, и рекомендовал пользователям использовать цвета, не слишком близкие к черным или белым. – martinr

+0

Другой вариант - пойти в сторону некоторых карикатуристов - сохранить бит-буфер, для которого пиксели должны быть белыми, чем белые или более черные, чем черные, но не могут быть из-за ограничений цветового пространства, а в финале образ, нарисуйте тонкую линию вокруг брызг этих областей. Другой вариант, если вы не выводите на монитор компьютера, заключается в увеличении кажущейся яркости некоторых областей каким-либо другим способом, например, со специализированным освещением. В рамках компьютерной обработки изображений на компьютерном мониторе, без мультяшных компромиссов, ваши возможности сильно ограничены! «Плохая коала - слишком белая»? – martinr

Смежные вопросы