打开PGM图像16 BPP
Open a pgm image 16 bpp
我需要将每个像素16位的PGM图像转换为每个像素8位PGM图像8位,但是我有读取PGM Image 16 BPP的问题,而我不明白我的内容我做错了。这里的代码:
#include "pgm.h"
#include <iterator>
#include <algorithm>
#include <fstream>
#include <sstream>
using namespace std;
bool convert16to8bit(const std::string& inFilename, mat<uint8_t>& img, const std::string& outFilename){
mat<uint16_t> imgTemp;
ifstream is(inFilename, ios::binary);
if (!is)
return false;
string magic;
is >> magic;
if (magic != "P2" && magic != "P5")
return false;
size_t rows, cols, nlevels;
is >> cols >> rows >> nlevels;
if (nlevels < 255)
return false;
is.get();
img = mat<uint8_t>(rows, cols);
if (nlevels == 255){
if (magic == "P5"){
is.unsetf(ios::skipws);
img.data_.assign(istream_iterator<uint8_t>(is), istream_iterator<uint8_t>());
}else
img.data_.assign(istream_iterator<int>(is), istream_iterator<int>());
}
else{
imgTemp = mat<uint16_t>(rows, cols);
if (magic == "P5"){
is.unsetf(ios::skipws);
imgTemp.data_.assign(istream_iterator<uint16_t>(is), istream_iterator<uint16_t>());
}
else
imgTemp.data_.assign(istream_iterator<int>(is), istream_iterator<int>());
for (size_t r = 0; r < rows; r++)
for (size_t c = 0; c < cols; c++)
img(r, c) = imgTemp(r, c);
}
stringstream ss;
ss << outFilename << ".pgm";
ofstream os(ss.str(), ios::binary);
if (!os)
return false;
os << magic <<"n" << cols << " " << rows << "n255n";
if (magic == "P2")
copy(begin(img), end(img), ostream_iterator<int>(os, " "));
else
copy(begin(img), end(img), ostream_iterator<uint8_t>(os));
return true;
}
//mat.h
#if !defined MAT_H
#define MAT_H
#include <vector>
template <typename T>
struct mat {
size_t rows_, cols_;
std::vector<T> data_;
mat(size_t rows = 0, size_t cols = 0) : rows_(rows), cols_(cols), data_(rows*cols) {}
const size_t rows() const { return rows_; }
const size_t cols() const { return cols_; }
const T& operator()(size_t r, size_t c) const { return data_[r*cols_ + c]; }
T& operator()(size_t r, size_t c) { return data_[r*cols_ + c]; }
auto begin() -> decltype(data_.begin()) { return data_.begin(); }
auto end() -> decltype(data_.end()) { return data_.end(); }
auto begin() const -> decltype(data_.begin()) { return data_.begin(); }
auto end() const -> decltype(data_.end()) { return data_.end(); }
};
#endif // MAT_H
此代码试图执行IMG(r,c(= imgtemp(r,c((错误:vector sibscript用PGM 16BPP(执行错误,但使用PGM 8BPP我可以打开它没有问题,并将其重新创建为原始的,没有错误。我认为问题与istream_iterator&lt;uint16_t>因为istream_iterator&lt;uint8_t>工作(带有PGM 8bit(。有任何解决方案吗?
感谢您的任何帮助
我找到了解决问题的方法。如果对某人有用,这是正确的代码:
#include "pgm.h"
#include <iterator>
#include <algorithm>
#include <fstream>
#include <sstream>
using namespace std;
bool convert16to8bit(const std::string& inFilename, mat<uint8_t>& img, const std::string& outFilename){
mat<uint16_t> imgTemp;
ifstream is(inFilename, ios::binary);
if (!is)
return false;
string magic;
is >> magic;
if (magic != "P2" && magic != "P5")
return false;
size_t rows, cols, nlevels;
is >> cols >> rows >> nlevels;
if (nlevels < 255)
return false;
is.get();
img = mat<uint8_t>(rows, cols);
if (nlevels == 255){
if (magic == "P5"){
is.unsetf(ios::skipws);
img.data_.assign(istream_iterator<uint8_t>(is), istream_iterator<uint8_t>());
}else
img.data_.assign(istream_iterator<int>(is), istream_iterator<int>());
}
else{
imgTemp = mat<uint16_t>(rows, cols);
if (magic == "P5"){
//here is the line changed
is.read(reinterpret_cast<char *>(&imgTemp.data_[0]), imgTemp.rows()*imgTemp.cols() * 2);
}
else
imgTemp.data_.assign(istream_iterator<int>(is), istream_iterator<int>());
for (size_t r = 0; r < rows; r++)
for (size_t c = 0; c < cols; c++)
img(r, c) = imgTemp(r, c);
}
stringstream ss;
ss << outFilename << ".pgm";
ofstream os(ss.str(), ios::binary);
if (!os)
return false;
os << magic <<"n" << cols << " " << rows << "n255n";
if (magic == "P2")
copy(begin(img), end(img), ostream_iterator<int>(os, " "));
else
copy(begin(img), end(img), ostream_iterator<uint8_t>(os));
return true;
}
相关文章:
- C++,OpenCV,尝试显示图像时"OpenCV(4.3.0) Error: Assertion failed (size.width>0 && size.height>0)"此错误
- 如何使用OpenCV将RBG图像转换为HSV,并将H、S和V值保存为C++中的3个独立图像
- OpenCV EqualizeHist()从彩色图像创建黑白图像
- 将"打开的CV图像"中的"颜色"转换为整数格式
- 平均图像时图像损坏
- 在C++中使用GDAL可以将图像的像素坐标转换为lat,long吗
- 如何将图像传输到c++(dll)中的缓冲区,然后在c#的缓冲区中读/写
- Vulkan验证层不断在VkQueuePresentKHR()上抛出图像布局错误
- 使用FFMPEG将RGB图像序列保存到.mp4时出现问题
- 将RGB图像保存为PPM格式
- 将图像添加到资源文件夹UWP C++
- 彩色图像的卤化物处理平均值
- C++射线示踪剂ppm表示没有足够的数据来显示图像
- 重新定位图像时如何前进到下一个内存块
- 如何使用按钮更新GTK3图像以使用C++从相机捕获图片
- 为什么 BMP 图像上的 imwrite 会卡住/不返回?
- Gstreamer:每 5 秒使用多文件墨水保存图像/jpeg
- 打开PGM图像16 BPP
- c++:将 24bpp 转换为 8 bpp 或 1bpp 图像
- 图像转换从24 bpp到16 bpp格式