Коала на втором изображении является 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.
Aw cute koala! :) – martinr