Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<stdio.h>
- #pragma pack(push, 1)
- typedef struct BITMAPFILEHEADER{
- unsigned short int bfType;
- unsigned long int bfSize;
- unsigned short int bfReserved1;
- unsigned short int bfReserved2;
- unsigned long int bfOffBits;
- } BITMAPFILEHEADER;
- typedef struct BITMAPINFOHEADER{
- unsigned long int biSize;
- long int biWidth;
- long int biHeight;
- unsigned short int biPlanes;
- unsigned short int biBitCount;
- unsigned long int biCompression;
- unsigned long int biSizeImage;
- long int biXPelsPerMeter;
- long int biYPelsPerMeter;
- unsigned long int biClrUsed;
- unsigned long int biClrImportant;
- } BITMAPINFOHEADER;
- typedef struct RGBTRIPLE {
- char rgbtBlue;
- char rgbtGreen;
- char rgbtRed;
- } RGBTRIPLE;
- #pragma pack(pop)
- void printInfo(BITMAPFILEHEADER filehdr, BITMAPINFOHEADER infohdr){
- printf("%x\n",filehdr.bfType);
- printf("%li\n",filehdr.bfSize);
- printf("%d\n",filehdr.bfReserved1);
- printf("%d\n",filehdr.bfReserved2);
- printf("%li\n\n",filehdr.bfOffBits);
- printf("%li\n", infohdr.biSize);
- printf("%li\n", infohdr.biWidth);
- printf("%li\n", infohdr.biHeight);
- printf("%d\n", infohdr.biPlanes);
- printf("%d\n", infohdr.biBitCount);
- printf("%li\n", infohdr.biCompression);
- printf("%li\n", infohdr.biSizeImage);
- printf("%li\n", infohdr.biXPelsPerMeter);
- printf("%li\n", infohdr.biYPelsPerMeter);
- printf("%li\n", infohdr.biClrUsed);
- printf("%li\n", infohdr.biClrImportant);
- }
- int checkCoordinates(int x0, int y0, int x1, int y1, int height, int width) { //возвращает 1, если координаты некорректны
- //возвращает 0, если данные введены верно
- if (x0 < 0 || y0 < 0 || x1 < 0|| y1 < 0) {
- return 1;
- }
- if (x0 > width || y0 > height || x1 > width || y1 > height ) {
- return 1;
- }
- return 0;
- }
- void rot(long int x0, long int y0, long int x1, long int y1, RGBTRIPLE** rgb) {
- RGBTRIPLE swapRgb [y1-y0+1][x1-x0+1];
- long int i, j, m = 0, k = 0;
- for ( i = x0; i <= y1; i ++ , k ++) {
- for ( j = y0; j <= x1; j++, m ++) {
- swapRgb[m][k] = rgb[i][j];
- }
- }
- for ( i = x0; i < y1; i ++ , m ++) {
- for ( j = y0; j < x1; j++, k ++) {
- rgb[i][j] = swapRgb[m][k];
- }
- }
- }
- int main(){
- BITMAPFILEHEADER filehdr;
- BITMAPINFOHEADER infohdr;
- RGBTRIPLE rgbChange;
- RGBTRIPLE rgbZero = {'0','0','0'};
- char inputFile[10];
- long int x0, y0, x1, y1, height, width, i, j, k = 0;
- int emptyBytes = 0, flagChange = 0; // flagChange == 1, если строка была отражена
- printf("Enter file name: ");
- scanf("%s", &inputFile);
- printf("Enter x0: ");
- scanf("%li", &x0);
- printf("Enter y0: ");
- scanf("%li", &y0);
- printf("Enter x1: ");
- scanf("%li", &x1);
- printf("Enter y1: ");
- scanf("%li", &y1);
- FILE* f = fopen(inputFile, "rb");
- if (!f){
- printf("Fail with file\n");
- return 0;
- }
- fread(&filehdr, sizeof(struct BITMAPFILEHEADER), 1, f);
- fread(&infohdr, sizeof(struct BITMAPINFOHEADER), 1, f);
- height = infohdr.biHeight;
- width = infohdr.biWidth;
- if (checkCoordinates(x0, y0, x1, y1, height, width)) {
- printf("Fail with coordinates\n");
- return 0;
- }
- FILE* newf = fopen("new.bmp", "wb");
- fwrite(&filehdr, sizeof(BITMAPFILEHEADER), 1, newf);
- fwrite(&infohdr, sizeof(BITMAPINFOHEADER), 1, newf);
- if ( (width * 3) % 4 ){
- emptyBytes = 4 - (width * 3) % 4;
- }
- RGBTRIPLE rgb[height][width];
- for (i = 0; i < height ; i++) {
- for (j = 0; j < width; j++) {
- fread(&rgb[i][j], sizeof(RGBTRIPLE), 1, f);
- }
- if (emptyBytes) {
- fread(&rgbChange, emptyBytes, 1, f);
- }
- }
- rot(x0, height - y0, x1, height - y1 , rgb);
- for (i = 0; i < height ; i++) {
- for (j = 0; j < width; j++ ) {
- fwrite(&rgb[i][j], sizeof(RGBTRIPLE), 1, newf);
- }
- if (emptyBytes) {
- fwrite(&rgbZero, emptyBytes, 1, newf);
- }
- }
- printf("Look new.bmp");
- fclose(f);
- fclose(newf);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement