void toBitmap(const Buffer2D& in,cl::CommandQueue & q, const char* filename) { std::ofstream out(filename,std::ios::binary); if (!out) throw std::runtime_error(std::string(filename) + " does not exists"); BidimArray<real> ans = in.read(q); BitmapFileHeader fileHeader; BitmapInfoHeader infoHeader; assert(sizeof(BitmapFileHeader) == 14); assert(sizeof(BitmapInfoHeader) == 40); int dimx = in.width() + (4-in.width()%4)%4; fileHeader.Signature = 19778; fileHeader.Size = sizeof(BitmapFileHeader)+sizeof(BitmapInfoHeader)+ sizeof(char)*dimx*in.height()+256*4; fileHeader.Reserved1 = fileHeader.Reserved2 = 0; fileHeader.BitsOffset = sizeof(BitmapFileHeader)+sizeof(BitmapInfoHeader)+256*4; infoHeader.HeaderSize = sizeof(BitmapInfoHeader); infoHeader.Width = in.width(); infoHeader.Height = in.height(); infoHeader.Planes = 1; infoHeader.BitCount = 8; infoHeader.Compression = 0; infoHeader.SizeImage = dimx*in.height(); infoHeader.PelsPerMeterX = 1; infoHeader.PelsPerMeterY = 1; infoHeader.ClrUsed = 256; infoHeader.ClrImportant = 256; out.write(reinterpret_cast<char*>(&fileHeader),sizeof(BitmapFileHeader)); out.write(reinterpret_cast<char*>(&infoHeader),sizeof(BitmapInfoHeader)); for (int i=0;i < 256;++i) { char b[4] = {i,i,i,i}; out.write(b,sizeof(b)); } BidimArray<char> buf (dimx,in.height()); real l_norm = LInfNorm(in,q); for (int j=0;j < buf.height();++j) { for (int i=0;i < ans.width();++i) buf(i,j) = 255*fabs(ans(i,j))/l_norm; for (int i= ans.width();i < buf.width();++i) buf(i,j) = 0; } out.write(buf.data(), sizeof(char)*buf.height()*buf.width()); }
//----------------------------------------------------------------------------- // TestMatrixLInfNorm //----------------------------------------------------------------------------- bool TestMatrixLInfNorm() { Matrix A("1,2,3;4,5,6;7,8,9"); return ApproxEqual( LInfNorm(A), 24.0, TOLERANCE); }