使用新的转换方法转换char *outputFile="output.bmp"
时间: 2023-06-19 12:05:59 浏览: 38
可以使用std::string来代替char*,然后使用std::string的c_str()方法来获取char*指针,示例代码如下:
```
std::string outputFile = "output.bmp";
// 转换为char*
const char* outputFileChar = outputFile.c_str();
```
这样就可以将原来的char*转换为std::string,并且在需要使用char*的地方,使用c_str()方法获取即可。
相关问题
用C++将24位bmp图像转换成8位unsigned char*不带bmp头的数据
可以按照以下步骤进行转换:
1. 打开24位bmp图像文件,并读取其像素数据。
2. 对于每个像素,将其RGB三个分量取平均值,得到一个灰度值。
3. 将每个灰度值按照8位无符号整数的格式存储到一个unsigned char*数组中。
4. 将该数组写入到一个新的文件中,不包括bmp头。
下面是一个实现的示例代码:
```c++
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
#pragma pack(push, 1)
struct BMPHeader {
uint16_t type;
uint32_t size;
uint16_t reserved1;
uint16_t reserved2;
uint32_t offset;
uint32_t header_size;
int32_t width;
int32_t height;
uint16_t planes;
uint16_t bit_count;
uint32_t compression;
uint32_t image_size;
int32_t x_pixels_per_meter;
int32_t y_pixels_per_meter;
uint32_t colors_used;
uint32_t important_colors;
};
#pragma pack(pop)
void write_data(const string& output_file, const unsigned char* data, size_t size) {
ofstream out(output_file, ios::out | ios::binary);
out.write((const char*)data, size);
out.close();
}
int main(int argc, char* argv[]) {
if (argc < 3) {
cout << "Usage: " << argv[0] << " input_file output_file" << endl;
return 1;
}
// 读取BMP文件头
BMPHeader header;
ifstream in(argv[1], ios::in | ios::binary);
in.read((char*)&header, sizeof(header));
// 读取像素数据
uint32_t data_size = header.width * header.height;
vector<unsigned char> pixel_data(data_size * 3);
in.read((char*)pixel_data.data(), pixel_data.size());
// 转换像素数据格式
vector<unsigned char> gray_data(data_size);
for (size_t i = 0; i < data_size; i++) {
unsigned char r = pixel_data[i * 3];
unsigned char g = pixel_data[i * 3 + 1];
unsigned char b = pixel_data[i * 3 + 2];
gray_data[i] = (r + g + b) / 3;
}
// 写入数据
write_data(argv[2], gray_data.data(), gray_data.size());
return 0;
}
```
注意,本示例代码只适用于没有调色板的24位BMP图像。如果图像中使用了调色板,需要根据调色板的颜色信息将每个像素转换为对应的颜色索引。
将代码补充完整,水印为中国制造,void add_watermark(const char* filename) { // 打开文件 FILE* file = fopen(filename, "rb+"); if (file == NULL) { // 文件打开失败 return; } // 读取文件头 BMP_FILE_HEADER file_header; fread(&file_header, sizeof(BMP_FILE_HEADER), 1, file); // 读取信息头 BMP_INFO_HEADER info_header; fread(&info_header, sizeof(BMP_INFO_HEADER), 1, file); // 计算图像数据的位置 int data_offset = file_header.offset; // 读取图像数据 char* data = malloc(info_header.image_size); fseek(file, data_offset, SEEK_SET); fread(data, info_header.image_size, 1, file); // 在图像数据上方加上水印 // ... // 将修改后的图像数据写回文件 fseek(file, data_offset, SEEK_SET); fwrite(data, info_header.image_size, 1, file); // 关闭文件并释放内存 fclose(file); free(data); }
将代码补充完整如下:
void add_watermark(const char* filename) {
// 打开文件
FILE* file = fopen(filename, "rb");
if (file == NULL) {
// 文件打开失败
return;
}
// 读取文件头
BMP_FILE_HEADER file_header;
fread(&file_header, sizeof(BMP_FILE_HEADER), 1, file);
// 读取位图信息头
BMP_INFO_HEADER info_header;
fread(&info_header, sizeof(BMP_INFO_HEADER), 1, file);
// 读取位图数据
int width = info_header.width;
int height = info_header.height;
int bytes_per_pixel = info_header.bits_per_pixel / 8;
int padding = (4 - (width * bytes_per_pixel) % 4) % 4;
int data_size = width * height * bytes_per_pixel + height * padding;
unsigned char* data = (unsigned char*)malloc(data_size);
fread(data, data_size, 1, file);
// 关闭文件
fclose(file);
// 在位图数据中添加水印
for (int y = 0; y < height; y++) {
for (int x = 0; x < width; x++) {
int offset = y * (width * bytes_per_pixel + padding) + x * bytes_per_pixel;
if (data[offset] == 0xff && data[offset + 1] == 0xff && data[offset + 2] == 0xff) {
data[offset] = 0;
data[offset + 1] = 0;
data[offset + 2] = 0;
}
else {
data[offset] = 0xff;
data[offset + 1] = 0xff;
data[offset + 2] = 0xff;
}
}
}
// 打开输出文件
char output_filename[FILENAME_MAX];
sprintf(output_filename, "%s_watermarked.bmp", filename);
FILE* output_file = fopen(output_filename, "wb");
if (output_file == NULL) {
// 文件打开失败
free(data);
return;
}
// 写入文件头
fwrite(&file_header, sizeof(BMP_FILE_HEADER), 1, output_file);
// 写入位图信息头
fwrite(&info_header, sizeof(BMP_INFO_HEADER), 1, output_file);
// 写入位图数据
fwrite(data
相关推荐
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![docx](https://img-home.csdnimg.cn/images/20210720083331.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)