-
Notifications
You must be signed in to change notification settings - Fork 299
/
ImageRAW.cpp
123 lines (103 loc) · 3.94 KB
/
ImageRAW.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
/******************************************************************************
* SOFA, Simulation Open-Framework Architecture *
* (c) 2006 INRIA, USTL, UJF, CNRS, MGH *
* *
* This program is free software; you can redistribute it and/or modify it *
* under the terms of the GNU Lesser General Public License as published by *
* the Free Software Foundation; either version 2.1 of the License, or (at *
* your option) any later version. *
* *
* This program is distributed in the hope that it will be useful, but WITHOUT *
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or *
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License *
* for more details. *
* *
* You should have received a copy of the GNU Lesser General Public License *
* along with this program. If not, see <http://www.gnu.org/licenses/>. *
*******************************************************************************
* Authors: The SOFA Team and external contributors (see Authors.txt) *
* *
* Contact information: contact@sofa-framework.org *
******************************************************************************/
#include <sofa/helper/logging/Messaging.h>
#include <sofa/helper/io/ImageRAW.h>
#include <sofa/helper/system/FileRepository.h>
#include <iostream>
#include <cstdio> // fopen and friends
namespace sofa::helper::io
{
ImageRAW::ImageRAW ()
: headerSize(0)
{}
void ImageRAW::initHeader(unsigned hsize)
{
headerSize = hsize;
header = (unsigned char*) malloc(headerSize);
}
bool ImageRAW::load(std::string filename)
{
m_bLoaded = 0;
if (!sofa::helper::system::DataRepository.findFile(filename))
{
msg_error("ImageRAW") << "File '" << filename << "' not found " ;
return false;
}
FILE *file;
/* make sure the file is there and open it read-only (binary) */
if ((file = fopen(filename.c_str(), "rb")) == nullptr)
{
msg_error("ImageRAW") << "File not found : '" << filename << "'";
return false;
}
// read header and ignore it as we don't know how to interpret it
for ( unsigned i=0; i<headerSize; ++i )
{
const int c = getc ( file );
if ( c == EOF )
{
fclose ( file );
return false;
}
else
header[i] = ( unsigned char ) c;
}
const unsigned int numVoxels = getImageSize();
// get the voxels from the file
unsigned char *data = getPixels();
for ( unsigned int i=0; i<numVoxels; ++i )
{
const int c = getc ( file );
if ( c == EOF )
{
fclose ( file );
return false;
}
else
data[i] = ( unsigned char ) c;
}
fclose(file);
m_bLoaded = 1;
return true;
}
bool ImageRAW::save(std::string filename, int)
{
FILE *file;
#ifndef NDEBUG
msg_info("ImageRAW") << "Writing RAW file " << filename ;
#endif
/* make sure the file is there and open it read-only (binary) */
if ((file = fopen(filename.c_str(), "wb")) == nullptr)
{
msg_error("ImageRAW") << "File write access failed : '" << filename << "'";
return false;
}
bool isWriteOk = true;
if (headerSize > 0)
{
isWriteOk = isWriteOk && fwrite(header, 1, headerSize, file) == headerSize;
}
isWriteOk = isWriteOk && fwrite(getPixels(), 1, getImageSize(), file) == getImageSize();
fclose(file);
return isWriteOk;
}
} // namespace sofa::helper::io