gpt4 book ai didi

c++ - 在 C++ 中调整卷文件的长度和宽度

转载 作者:行者123 更新时间:2023-11-30 03:37:50 25 4
gpt4 key购买 nike

我有一个可变切片长度、图像高度为 640、图像宽度为 512 的卷文件。我想将它转换为一个高度为 620、宽度为 420 的文件,并将其写入一个新的文件。我想从高度的顶部去掉 20 个像素,并从宽度的每一侧去掉 46 个像素来调整大小。每个像素都是无符号的 16 位。我不确定如何进行实际操作。

这是我的主要内容:

FILE* pfile = NULL;
FILE* pfile2 = NULL;

pFile = fopen("test.vol", "rb");
fseek (pFile , 0 , SEEK_END);

int fileData = ftell(pFile);
rewind(pFile);

char* FileBuffer = new char[fileData];
fread(FileBuffer, fileData, 1, pFile);

int height = 640;
int width = 512;
int slizeSize = height * width * 2;
int sliceCount = fileData / sliceSize;
uint16_t pixels;

int newHeight = height - 20;
int newWidth = width - 92;
int newSliceSize = newHeight * newWidth * 2;
int newImageSize = newSliceSize * sliceCount;

char* NewFileBuffer = new char[newImageSize];

for (int i = 0; i < newHeight; i++) {

for (int i = 0; i < newWidth; i++) {

}
// need help in these for loops and after

}

fclose (pFile);
free (FileBuffer);

pFile2 = fopen("test2.vol", "wb");
fwrite(NewFileBuffer, NewImageSize, 1, pFile2);

最佳答案

如果您使用 C++ 编程,请使用 C++:摆脱 FILE* 和其他 C 东西。

您正在使用 new 分配一个 char 数组,但调用 free 来释放内存:您应该调用 delete[ ],或者更好的是你应该使用 std::vector 并让它为你管理内存。

您正在处理 16 位值,那么为什么不读取/写入/处理 16 位值?

首先,读取文件:

#include <fstream>
#include <iterator>
#include <vector>

int main()
{
using data_type = uint16_t;

std::basic_ifstream<data_type> file_in{
"test.vol",
std::ifstream::binary
};
std::vector<data_type> FileBuffer{
std::istreambuf_iterator<data_type>(file_in),
std::istreambuf_iterator<data_type>() // end of stream iterator
};

现在 FileBuffer 是一个 uint16_t 数组,其中填充了 "test.vol" 的内容,具有托管内存分配和释放。

下一部分,调整音量大小。我假设您的数据按以下顺序打包:列、行、切片。不清楚顶部是切片的第一行还是最后一行。这是我使用迭代器和 std::copy 的提议:

    size_t height = 640, width = 512;
size_t sliceSize = height * width;
size_t sliceCount = FileBuffer.size() / sliceSize;

size_t newHeight = height - 20, newWidth = width - 92;
size_t newSliceSize = newHeight * newWidth;
size_t newImageSize = newSliceSize * sliceCount;

std::vector<data_type> NewFileBuffer(newImageSize);

auto it_buffer = FileBuffer.begin();
auto it_new_buffer = NewFileBuffer.begin();

for (size_t i = 0; i < sliceCount; ++i)
{
// skip 20 first lines, remove and uncomment the next line
// if you want to skip the last ones
auto it_line = it_buffer + 20*width;
//auto it_line = it_buffer;

for (size_t j = 0; j < newHeight; ++j)
{
auto it_column = it_line + 46;

it_new_buffer = std::copy(
it_column,
it_column + newWidth,
it_new_buffer
);

it_line += width; // go to next line
}

it_buffer += sliceSize; // go to next slice
}

最后写入文件:

    std::basic_ofstream<data_type> file_out{
"test2.vol",
std::ofstream::binary
};
std::copy(
NewFileBuffer.begin(),
NewFileBuffer.end(),
std::ostreambuf_iterator<data_type>(file_out)
);
}

关于c++ - 在 C++ 中调整卷文件的长度和宽度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39978878/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com