#include <stdio.h>\n#include <stdlib.h>\n\ntypedef struct {\n unsigned char red;\n unsigned char green;\n unsigned char blue;\n} Pixel;\n\ntypedef struct {\n int width;\n int height;\n Pixel *pixels;\n} Image;\n\nImage loadImage(const char *filename) {\n FILE *file = fopen(filename, "rb");\n if (file == NULL) {\n printf("Failed to open file: %s\n", filename);\n exit(1);\n }\n\n char format[3];\n fread(format, sizeof(char), 2, file);\n format[2] = '\0';\n\n if (format[0] != 'B' || format[1] != 'M') {\n printf("Invalid file format: %s\n", filename);\n exit(1);\n }\n\n fseek(file, 10, SEEK_SET);\n int offset;\n fread(&offset, sizeof(int), 1, file);\n\n fseek(file, 18, SEEK_SET);\n int width, height;\n fread(&width, sizeof(int), 1, file);\n fread(&height, sizeof(int), 1, file);\n\n fseek(file, offset, SEEK_SET);\n int imageSize = width * height;\n Pixel *pixels = (Pixel *)malloc(imageSize * sizeof(Pixel));\n fread(pixels, sizeof(Pixel), imageSize, file);\n\n fclose(file);\n\n Image image;\n image.width = width;\n image.height = height;\n image.pixels = pixels;\n\n return image;\n}\n\nvoid saveImage(const char *filename, Image image) {\n FILE *file = fopen(filename, "wb");\n if (file == NULL) {\n printf("Failed to create file: %s\n", filename);\n exit(1);\n }\n\n fwrite("BM", sizeof(char), 2, file);\n int offset = sizeof(Pixel) * image.width * image.height + 54;\n fwrite(&offset, sizeof(int), 1, file);\n int zero = 0;\n fwrite(&zero, sizeof(int), 1, file);\n int headerSize = 54;\n fwrite(&headerSize, sizeof(int), 1, file);\n int imageSize = image.width * image.height;\n fwrite(&image.width, sizeof(int), 1, file);\n fwrite(&image.height, sizeof(int), 1, file);\n short planes = 1;\n fwrite(&planes, sizeof(short), 1, file);\n short bitsPerPixel = 24;\n fwrite(&bitsPerPixel, sizeof(short), 1, file);\n int compression = 0;\n fwrite(&compression, sizeof(int), 1, file);\n fwrite(&imageSize, sizeof(int), 1, file);\n int xPixelsPerMeter = 0;\n int yPixelsPerMeter = 0;\n fwrite(&xPixelsPerMeter, sizeof(int), 1, file);\n fwrite(&yPixelsPerMeter, sizeof(int), 1, file);\n int colorsUsed = 0;\n fwrite(&colorsUsed, sizeof(int), 1, file);\n int importantColors = 0;\n fwrite(&importantColors, sizeof(int), 1, file);\n\n fwrite(image.pixels, sizeof(Pixel), imageSize, file);\n\n fclose(file);\n}\n\nImage extractCenterImage(Image image, int regionSize) {\n if (regionSize > image.width || regionSize > image.height) {\n printf("Region size is larger than image size\n");\n exit(1);\n }\n\n int startX = (image.width - regionSize) / 2;\n int startY = (image.height - regionSize) / 2;\n int endX = startX + regionSize;\n int endY = startY + regionSize;\n\n Image centerImage;\n centerImage.width = regionSize;\n centerImage.height = regionSize;\n centerImage.pixels = (Pixel *)malloc(regionSize * regionSize * sizeof(Pixel));\n\n for (int y = startY; y < endY; y++) {\n for (int x = startX; x < endX; x++) {\n int sourceIndex = y * image.width + x;\n int targetIndex = (y - startY) * regionSize + (x - startX);\n centerImage.pixels[targetIndex] = image.pixels[sourceIndex];\n }\n }\n\n return centerImage;\n}\n\nint main() {\n const char *inputFile = "input.bmp";\n const char *outputFile = "output.bmp";\n int regionSize = 128;\n\n Image image = loadImage(inputFile);\n Image centerImage = extractCenterImage(image, regionSize);\n saveImage(outputFile, centerImage);\n\n free(image.pixels);\n free(centerImage.pixels);\n\n return 0;\n

C 语言图像处理:提取图像中心区域并保存

原文地址: https://www.cveoy.top/t/topic/pv8p 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录