00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00024
00025 #include <qvio.h>
00026 #include <qvipp.h>
00027
00028
00029 template<int Channels> void readUCharImageFileFromImageData(QFile &file, QVImage<uChar, Channels> &image)
00030 {
00031 for (uInt i = 0; i < image.getRows(); i++)
00032 file.read((char *) image.getWriteData() + i*image.getStep(), Channels * image.getCols());
00033 }
00034
00035 template<int Channels> void writeUCharImageDataToImageFile(QFile &file, const QVImage<uChar, Channels> &image)
00036 {
00037 for (uInt i = 0; i < image.getRows(); i++)
00038 file.write((char *) image.getReadData() + i*image.getStep(), Channels * image.getCols());
00039 }
00040
00041 bool writeYUV4MPEG2Header(QFile &file, const int cols, const int rows, const int fps)
00042 {
00043 file.write(QString("YUV4MPEG2 W%1 H%2 F%3:1 Ip A0:0\x0a").arg(cols).arg(rows).arg(fps).toAscii());
00044
00045 return true;
00046 }
00047
00048 bool writeYUV4MPEG2Frame(QFile &file, const QVImage<uChar,1> imageY, const QVImage<uChar,1> imageU, const QVImage<uChar,1> imageV)
00049 {
00050
00051 file.write(QString("FRAME\x0a").toAscii());
00052
00053
00054 writeUCharImageDataToImageFile<1>(file, imageY);
00055 writeUCharImageDataToImageFile<1>(file, imageU);
00056 writeUCharImageDataToImageFile<1>(file, imageV);
00057
00058 file.flush();
00059
00060 return true;
00061 }
00062
00063 bool writeYUV4MPEG2Frame(QFile &file, const QVImage<uChar,3> imageRGB)
00064 {
00065 const int cols = imageRGB.getCols(), rows = imageRGB.getRows();
00066 QVImage<uChar, 1> imageY(cols, rows);
00067 QVImage<uChar, 1> imageU(cols/2, rows/2);
00068 QVImage<uChar, 1> imageV(cols/2, rows/2);
00069
00070 RGBToYUV420(imageRGB, imageY, imageU, imageV);
00071
00072 writeYUV4MPEG2Frame(file, imageY, imageU, imageV);
00073
00074 return true;
00075 }
00076
00077 bool writeQVImageToFile(const QString fileName, const QVImage<uChar, 3> &image)
00078 { return ((QImage) image).save(fileName); }
00079
00080 bool readQVImageFromFile(const QString fileName, QVImage<uChar, 3> &image)
00081 {
00082 QImage qimg;
00083
00084 if(not qimg.load(fileName)) return FALSE;
00085
00086 image = QVImage<uChar, 3>(qimg);
00087
00088 return TRUE;
00089 }