Применение эффектов к изображению с помощью VC ++? - PullRequest
1 голос
/ 22 декабря 2009

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

Любые вклады приветствуются .....

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

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

Ответы [ 2 ]

1 голос
/ 23 декабря 2009

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

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

0 голосов
/ 22 декабря 2009

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

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

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

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

В приведенных выше 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

ИМХО Использование C ++ - это нормально, но вы будете работать так низкоуровнево и не будете использовать полиморфизм, так что, вероятно, концепции ОО и инкапсуляция не принесут вам такой большой пользы, как концепции С и инкапсуляция. Не стесняйтесь писать методы как функции в пространстве имен 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 и, возможно, некоторые другие должны быть написаны самостоятельно, и вам может понадобиться добавить в zlig и zi # и в ваши libb или libp добавление в libjpg .

EDIT

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

EDIT

Изменен ref-tile.jpg в ref-tile.png.

...