00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00039 #include <QVApplication>
00040 #include <QVMPlayerCamera>
00041 #include <QVDefaultGUI>
00042 #include <QVImageCanvas>
00043 #include <QVVideoRecorder>
00044
00046 #include <unistd.h>
00047 #include <stdlib.h>
00048 #include <stdio.h>
00049 #include <string.h>
00050 #include <stdarg.h>
00051
00052 #define PNG_DEBUG 3
00053 #include <png.h>
00054
00055 void abort_(const char * s, ...)
00056 {
00057 va_list args;
00058 va_start(args, s);
00059 vfprintf(stderr, s, args);
00060 fprintf(stderr, "\n");
00061 va_end(args);
00062 abort();
00063 }
00064
00065 int x, y;
00066
00067 int width, height;
00068 png_byte color_type;
00069 png_byte bit_depth;
00070
00071 png_structp png_ptr;
00072 png_infop info_ptr;
00073 int number_of_passes;
00074 png_bytep * row_pointers;
00075
00076 void read_png_file(const char* file_name, QVImage<uChar, 3> &image)
00077 {
00078 png_byte header[8];
00079
00080
00081 FILE *fp = fopen(file_name, "rb");
00082 if (!fp)
00083 abort_("[read_png_file] File %s could not be opened for reading", file_name);
00084 fread(header, 1, 8, fp);
00085 if (png_sig_cmp(header, 0, 8))
00086 abort_("[read_png_file] File %s is not recognized as a PNG file", file_name);
00087
00088
00089 png_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);
00090
00091 if (!png_ptr)
00092 abort_("[read_png_file] png_create_read_struct failed");
00093
00094 info_ptr = png_create_info_struct(png_ptr);
00095 if (!info_ptr)
00096 abort_("[read_png_file] png_create_info_struct failed");
00097
00098 if (setjmp(png_jmpbuf(png_ptr)))
00099 abort_("[read_png_file] Error during init_io");
00100
00101 png_init_io(png_ptr, fp);
00102 png_set_sig_bytes(png_ptr, 8);
00103
00104 png_read_info(png_ptr, info_ptr);
00105
00106 width = info_ptr->width;
00107 height = info_ptr->height;
00108
00109 image = QVImage<uChar, 3>(width, height);
00110
00111 color_type = info_ptr->color_type;
00112 bit_depth = info_ptr->bit_depth;
00113
00114 number_of_passes = png_set_interlace_handling(png_ptr);
00115 png_read_update_info(png_ptr, info_ptr);
00116
00117
00118
00119 if (setjmp(png_jmpbuf(png_ptr)))
00120 abort_("[read_png_file] Error during read_image");
00121
00122 row_pointers = (png_bytep*) malloc(sizeof(png_bytep) * height);
00123 for (y=0; y<height; y++)
00124
00125 row_pointers[y] = image.getWriteData() + y*image.getStep();
00126
00127 png_read_image(png_ptr, row_pointers);
00128
00129 fclose(fp);
00130
00131 const int Channels = 4;
00132 for (int i= 0; i < height; i++)
00133 for (int j = 0; j < width; j++)
00134 for (int c = 0; c < 3; c++)
00135 image(j,i,c) = row_pointers[i][Channels*j+c];
00136 }
00137
00138
00139 void write_png_file(const char* file_name)
00140 {
00141
00142 FILE *fp = fopen(file_name, "wb");
00143 if (!fp)
00144 abort_("[write_png_file] File %s could not be opened for writing", file_name);
00145
00146
00147
00148 png_ptr = png_create_write_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);
00149
00150 if (!png_ptr)
00151 abort_("[write_png_file] png_create_write_struct failed");
00152
00153 info_ptr = png_create_info_struct(png_ptr);
00154 if (!info_ptr)
00155 abort_("[write_png_file] png_create_info_struct failed");
00156
00157 if (setjmp(png_jmpbuf(png_ptr)))
00158 abort_("[write_png_file] Error during init_io");
00159
00160 png_init_io(png_ptr, fp);
00161
00162
00163
00164 if (setjmp(png_jmpbuf(png_ptr)))
00165 abort_("[write_png_file] Error during writing header");
00166
00167 png_set_IHDR(png_ptr, info_ptr, width, height,
00168 bit_depth, color_type, PNG_INTERLACE_NONE,
00169 PNG_COMPRESSION_TYPE_BASE, PNG_FILTER_TYPE_BASE);
00170
00171 png_write_info(png_ptr, info_ptr);
00172
00173
00174
00175 if (setjmp(png_jmpbuf(png_ptr)))
00176 abort_("[write_png_file] Error during writing bytes");
00177
00178 png_write_image(png_ptr, row_pointers);
00179
00180
00181
00182 if (setjmp(png_jmpbuf(png_ptr)))
00183 abort_("[write_png_file] Error during end of write");
00184
00185 png_write_end(png_ptr, NULL);
00186
00187
00188 for (y=0; y<height; y++)
00189 free(row_pointers[y]);
00190 free(row_pointers);
00191
00192 fclose(fp);
00193 }
00194
00196
00197 #ifndef DOXYGEN_IGNORE_THIS
00198 class PlayerWorker: public QVWorker
00199 {
00200 public:
00201 PlayerWorker(QString name): QVWorker(name)
00202 {
00203 addProperty< QVImage<uChar,3> >("Input image", inputFlag|outputFlag);
00204 addProperty< QString >("Image name", inputFlag, "flower.ppm");
00205 QVImage<uChar,3> image;
00206
00207 readQVImageFromFile(getPropertyValue< QString > ("Image name"), image);
00208
00209 addProperty< QVImage<uChar,3> >("Flower", outputFlag, image);
00210
00211 writeQVImageToFile("flower2.ppm", image);
00212 }
00213
00214 void iterate() { }
00215 };
00216
00217 int main(int argc, char *argv[])
00218 {
00219 QVApplication app(argc, argv, "Example program for QVision library. Displays the contents of a video source.");
00220
00221 QVMPlayerCamera camera("Video");
00222 PlayerWorker player("Video player");
00223 camera.link(&player,"Input image");
00224
00225
00226 QVVideoRecorder recorder("Video recorder");
00227
00228 recorder.linkProperty(player, "Input image");
00229
00230 QVDefaultGUI interface;
00231
00232 QVImageCanvas imageCanvas("Output image");
00233 imageCanvas.linkProperty(player, "Input image");
00234
00235
00236
00237
00238
00239
00240
00241 QVImageCanvas imageCanvasTest("flower.ppm");
00242 imageCanvasTest.linkProperty(player, "Flower");
00243
00244 return app.exec();
00245 }
00246
00247 #endif
00248