X-Git-Url: http://git.kpe.io/?a=blobdiff_plain;f=libctsim%2Fimagefile.cpp;h=4a49465065257ba2f02dd5c4df6c20e2b1cd4ebc;hb=ab78de6e33fff94c37847621458db3ad430a8bb3;hp=bab87bdeff5ab0fa4486a66f629089e85efd4d91;hpb=3ea498d51ce4597e9649cd21f155b51175ea0bea;p=ctsim.git diff --git a/libctsim/imagefile.cpp b/libctsim/imagefile.cpp index bab87bd..4a49465 100644 --- a/libctsim/imagefile.cpp +++ b/libctsim/imagefile.cpp @@ -9,7 +9,7 @@ ** This is part of the CTSim program ** Copyright (c) 1983-2001 Kevin Rosenberg ** -** $Id: imagefile.cpp,v 1.42 2001/03/21 21:45:31 kevin Exp $ +** $Id: imagefile.cpp,v 1.46 2002/06/27 03:19:23 kevin Exp $ ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License (version 2) as @@ -46,6 +46,7 @@ const int ImageFile::EXPORT_FORMAT_PNG16 = 4; #ifdef HAVE_CTN_DICOM const int ImageFile::EXPORT_FORMAT_DICOM = 5; #endif +const int ImageFile::EXPORT_FORMAT_RAW = 6; const char* ImageFile::s_aszExportFormatName[] = { @@ -840,7 +841,7 @@ ImageFile::fftRows (ImageFile& result) const fftw_complex* in = new fftw_complex [m_nx]; std::complex* pcRow = new std::complex [m_nx]; - for (int iy = 0; iy < m_ny; iy++) { + for (unsigned int iy = 0; iy < m_ny; iy++) { unsigned int ix; for (ix = 0; ix < m_nx; ix++) { in[ix].re = vReal[ix][iy]; @@ -891,7 +892,7 @@ ImageFile::ifftRows (ImageFile& result) const std::complex* pcRow = new std::complex [m_nx]; unsigned int ix, iy; - unsigned int iArray = 0; + // unsigned int iArray = 0; for (iy = 0; iy < m_ny; iy++) { for (ix = 0; ix < m_nx; ix++) { double dImag = 0; @@ -942,7 +943,7 @@ ImageFile::fftCols (ImageFile& result) const std::complex* pcCol = new std::complex [m_ny]; fftw_complex* in = new fftw_complex [m_ny]; - for (int ix = 0; ix < m_nx; ix++) { + for (unsigned int ix = 0; ix < m_nx; ix++) { unsigned int iy; for (iy = 0; iy < m_ny; iy++) { in[iy].re = vReal[ix][iy]; @@ -993,7 +994,7 @@ ImageFile::ifftCols (ImageFile& result) const std::complex* pcCol = new std::complex [m_ny]; unsigned int ix, iy; - unsigned int iArray = 0; + // unsigned int iArray = 0; for (ix = 0; ix < m_nx; ix++) { for (iy = 0; iy < m_ny; iy++) { double dImag = 0; @@ -1185,7 +1186,7 @@ ImageFile::magnitude (ImageFile& result) const if (isComplex()) vRealResult[ix][iy] = ::sqrt (vReal[ix][iy] * vReal[ix][iy] + vImag[ix][iy] * vImag[ix][iy]); else - vRealResult[ix][iy] = vReal[ix][iy]; + vRealResult[ix][iy] = ::fabs(vReal[ix][iy]); } if (result.isComplex()) @@ -1608,22 +1609,24 @@ ImageFile::readImagePNG (const char* const pszFile) ImageFileArray v = getArray(); for (int iy = 0; iy < height; iy++) { for (int ix = 0; ix < width; ix++) { - double dV; + double dV = 0; if (color_type == PNG_COLOR_TYPE_GRAY) { if (bit_depth == 8) dV = row_pointers[iy][ix] / 255.; else if (bit_depth == 16) { int iBase = ix * 2; dV = (row_pointers[iy][iBase] + (row_pointers[iy][iBase+1] << 8)) / 65536.; - } + } else + dV = 0; } else if (color_type == PNG_COLOR_TYPE_RGB) { if (bit_depth == 8) { int iBase = ix * 3; double dR = row_pointers[iy][iBase] / 255.; double dG = row_pointers[iy][iBase+1] / 255.; double dB = row_pointers[iy][iBase+2] / 255.; - dV = colorToGrayscale (dR, dG, dR); - } + dV = colorToGrayscale (dR, dG, dB); + } else + dV = 0; } v[ix][height-iy-1] = dV; } @@ -1667,6 +1670,9 @@ ImageFile::exportImage (const char* const pszFormat, const char* const pszFilena return bSuccess; } #endif + else if (iFormatID == EXPORT_FORMAT_RAW) + return writeImageRaw(pszFilename, nxcell, nycell); + sys_error (ERR_SEVERE, "Invalid format %s [ImageFile::exportImage]", pszFormat); return false; @@ -1815,7 +1821,7 @@ ImageFile::writeImagePNG (const char* const outfile, int bitdepth, int nxcell, i png_init_io(png_ptr, fp); - png_set_IHDR (png_ptr, info_ptr, nx * nxcell, ny * nycell, bitdepth, PNG_COLOR_TYPE_GRAY, PNG_INTERLACE_NONE, PNG_COMPRESSION_TYPE_BASE, PNG_FILTER_TYPE_DEFAULT); + png_set_IHDR (png_ptr, info_ptr, nx * nxcell, ny * nycell, bitdepth, PNG_COLOR_TYPE_GRAY, PNG_INTERLACE_NONE, PNG_COMPRESSION_TYPE_DEFAULT, PNG_FILTER_TYPE_DEFAULT); png_write_info(png_ptr, info_ptr); for (int irow = ny - 1; irow >= 0; irow--) { @@ -1900,3 +1906,26 @@ ImageFile::writeImageGIF (const char* const outfile, int nxcell, int nycell, dou } #endif +bool +ImageFile::writeImageRaw (const char* const outfile, int nxcell, int nycell) +{ + FILE *fp; + int nx = m_nx; + int ny = m_ny; + ImageFileArray v = getArray(); + + if ((fp = fopen (outfile, "wb")) == NULL) + return false; + + for (int irow = ny - 1; irow >= 0; irow--) { + for (int icol = 0; icol < nx; icol++) { + float dens = v[icol][irow]; + fwrite(&dens, sizeof(float), 1, fp); + } + } + + fclose(fp); + return true; +} + +