diff --git a/Programmation/TP/TP2-traitement_dimages/gfx_example/Makefile b/Programmation/TP/TP2-traitement_dimages/gfx_example/Makefile
new file mode 100644
index 0000000000000000000000000000000000000000..fe8bf89093787d66d0e525c700c2dad7298ec36f
--- /dev/null
+++ b/Programmation/TP/TP2-traitement_dimages/gfx_example/Makefile
@@ -0,0 +1,12 @@
+CC=gcc
+CFLAGS=-Wall -Wextra -std=c11 -g -fsanitize=leak -fsanitize=undefined  -fsanitize=address
+LIBS=-lSDL2
+ 
+
+all: gfx_example
+
+gfx_example: gfx_example.c gfx.c
+	$(CC) $(CFLAGS) $^ -o $@ $(LIBS)
+
+clean:
+	rm -f gfx_example
diff --git a/Programmation/TP/TP2-traitement_dimages/gfx_example/gfx.c b/Programmation/TP/TP2-traitement_dimages/gfx_example/gfx.c
new file mode 100644
index 0000000000000000000000000000000000000000..aca1933358386e2b4c3e2c0dd05bcc20f06373c1
--- /dev/null
+++ b/Programmation/TP/TP2-traitement_dimages/gfx_example/gfx.c
@@ -0,0 +1,95 @@
+/// @file gfx.c
+/// @author Florent Gluck
+/// @date November 6, 2016
+/// Helper routines to render pixels in fullscreen graphic mode.
+/// Uses the SDL2 library.
+
+#include "gfx.h"
+
+/// Create a fullscreen graphic window.
+/// @param title Title of the window.
+/// @param width Width of the window in pixels.
+/// @param height Height of the window in pixels.
+/// @return a pointer to the graphic context or NULL if it failed.
+struct gfx_context_t* gfx_create(char *title, uint width, uint height) {
+	if (SDL_Init(SDL_INIT_VIDEO) != 0) goto error;
+	SDL_Window *window = SDL_CreateWindow(title, SDL_WINDOWPOS_CENTERED,
+		SDL_WINDOWPOS_CENTERED, width, height, SDL_WINDOW_RESIZABLE);
+	SDL_Renderer *renderer = SDL_CreateRenderer(window, -1, 0);
+	SDL_Texture *texture = SDL_CreateTexture(renderer, SDL_PIXELFORMAT_ARGB8888,
+			SDL_TEXTUREACCESS_STREAMING, width, height);
+	uint32_t *pixels = malloc(width*height*sizeof(uint32_t));
+	struct gfx_context_t *ctxt = malloc(sizeof(struct gfx_context_t));
+
+	if (!window || !renderer || !texture || !pixels || !ctxt) goto error;
+
+	ctxt->renderer = renderer;
+	ctxt->texture = texture;
+	ctxt->window = window;
+	ctxt->width = width;
+	ctxt->height = height;
+	ctxt->pixels = pixels;
+
+	SDL_ShowCursor(SDL_DISABLE);
+	gfx_clear(ctxt, COLOR_BLACK);
+	return ctxt;
+
+error:
+	return NULL;
+}
+
+/// Draw a pixel in the specified graphic context.
+/// @param ctxt Graphic context where the pixel is to be drawn.
+/// @param x X coordinate of the pixel.
+/// @param y Y coordinate of the pixel.
+/// @param color Color of the pixel.
+void gfx_putpixel(struct gfx_context_t *ctxt, int x, int y, uint32_t color) {
+	if (x < ctxt->width && y < ctxt->height)
+		ctxt->pixels[ctxt->width*y+x] = color;
+}
+
+/// Clear the specified graphic context.
+/// @param ctxt Graphic context to clear.
+/// @param color Color to use.
+void gfx_clear(struct gfx_context_t *ctxt, uint32_t color) {
+	int n = ctxt->width*ctxt->height;
+	while (n)
+		ctxt->pixels[--n] = color;
+}
+
+/// Display the graphic context.
+/// @param ctxt Graphic context to clear.
+void gfx_present(struct gfx_context_t *ctxt) {
+	SDL_UpdateTexture(ctxt->texture, NULL, ctxt->pixels, ctxt->width*sizeof(uint32_t));
+	SDL_RenderCopy(ctxt->renderer, ctxt->texture, NULL, NULL);
+	SDL_RenderPresent(ctxt->renderer);
+}
+
+/// Destroy a graphic window.
+/// @param ctxt Graphic context of the window to close.
+void gfx_destroy(struct gfx_context_t *ctxt) {
+	SDL_ShowCursor(SDL_ENABLE);
+	SDL_DestroyTexture(ctxt->texture);
+	SDL_DestroyRenderer(ctxt->renderer);
+	SDL_DestroyWindow(ctxt->window);
+	free(ctxt->pixels);
+	ctxt->texture = NULL;
+	ctxt->renderer = NULL;
+	ctxt->window = NULL;
+	ctxt->pixels = NULL;
+	SDL_Quit();
+	free(ctxt);
+}
+
+/// If a key was pressed, returns its key code (non blocking call).
+/// List of key codes: https://wiki.libsdl.org/SDL_Keycode
+/// @return the key that was pressed or 0 if none was pressed.
+SDL_Keycode gfx_keypressed() {
+	SDL_Event event;
+	if (SDL_PollEvent(&event)) {
+		if (event.type == SDL_KEYDOWN)
+			return event.key.keysym.sym;
+	}
+	return 0;
+}
+
diff --git a/Programmation/TP/TP2-traitement_dimages/gfx_example/gfx.h b/Programmation/TP/TP2-traitement_dimages/gfx_example/gfx.h
new file mode 100644
index 0000000000000000000000000000000000000000..72bbdc3906e7aac7eef073259807379c6a27d4a8
--- /dev/null
+++ b/Programmation/TP/TP2-traitement_dimages/gfx_example/gfx.h
@@ -0,0 +1,41 @@
+#ifndef _GFX_H_
+#define _GFX_H_
+
+#include <stdint.h>
+#include <stdbool.h>
+#include <SDL2/SDL.h>
+
+#define MAKE_COLOR(r,g,b) ((uint32_t)b|((uint32_t)g<<8)|((uint32_t)r<<16))
+
+#define COLOR_GET_B(color) (color & 0xff)
+#define COLOR_GET_G(color) ((color >> 8) & 0xff)
+#define COLOR_GET_R(color) ((color >> 16) & 0xff)
+
+#define COLOR_BLACK  0x00000000
+#define COLOR_RED    0x00FF0000
+#define COLOR_GREEN  0x0000FF00
+#define COLOR_BLUE   0x000000FF
+#define COLOR_WHITE  0x00FFFFFF
+#define COLOR_YELLOW 0x00FFFF00
+
+typedef unsigned int  uint;
+typedef unsigned long ulong;
+typedef unsigned char uchar;
+
+struct gfx_context_t {
+	SDL_Window *window;
+	SDL_Renderer *renderer;
+	SDL_Texture *texture;
+	uint32_t *pixels;
+	int width;
+	int height;
+};
+
+extern void gfx_putpixel(struct gfx_context_t *ctxt, int x, int y, uint32_t color);
+extern void gfx_clear(struct gfx_context_t *ctxt, uint32_t color);
+extern struct gfx_context_t* gfx_create(char *text, uint width, uint height);
+extern void gfx_destroy(struct gfx_context_t *ctxt);
+extern void gfx_present(struct gfx_context_t *ctxt);
+extern SDL_Keycode gfx_keypressed();
+
+#endif
diff --git a/Programmation/TP/TP2-traitement_dimages/gfx_example/gfx_example.c b/Programmation/TP/TP2-traitement_dimages/gfx_example/gfx_example.c
new file mode 100644
index 0000000000000000000000000000000000000000..cff6c5cc180a2c702303f3e6949bb915e020d86f
--- /dev/null
+++ b/Programmation/TP/TP2-traitement_dimages/gfx_example/gfx_example.c
@@ -0,0 +1,37 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdbool.h>
+#include "gfx.h"
+
+/// Render some white noise.
+/// @param context graphical context to use.
+static void render(struct gfx_context_t *context, int width, int height) {
+	gfx_clear(context, COLOR_BLACK);
+
+	for (int i = 0; i < width*height/10; i++) {
+		int x = rand() % context->width;
+		int y = rand() % context->height;
+		uint32_t intensity = rand() % 256;  // 8-bit per color channel
+		uint32_t color = MAKE_COLOR(intensity,intensity,intensity);
+		gfx_putpixel(context, x, y, color);
+	}
+}
+
+/// Program entry point.
+/// @return the application status code (0 if success).
+int main() {
+	int width = 800, height = 600;
+	struct gfx_context_t *ctxt = gfx_create("Example", width, height);
+	if (!ctxt) {
+		fprintf(stderr, "Graphics initialization failed!\n");
+		return EXIT_FAILURE;
+	}
+
+	while (gfx_keypressed() != SDLK_ESCAPE) {
+		render(ctxt, width, height);
+		gfx_present(ctxt);
+	}
+
+	gfx_destroy(ctxt);
+	return EXIT_SUCCESS;
+}