18.03.31 顺时针旋转90°24位真彩色bmp图片

 1 #include <iostream>
 2 #include <fstream>
 3 #include <fstream>
 4 #include <Windows.h>
 5
 6 using namespace std;
 7
 8 int main(int argc,char*argv[])
 9 {
10     tagBITMAPFILEHEADER a;//头信息块
11     tagBITMAPINFOHEADER b;//描述块
12     ifstream fin(argv[1], ios::binary | ios::in);//打开argv1用于读取,原文件
13     if (!fin)cout << "Source file open error." << endl;
14     ofstream fout(argv[2], ios::binary | ios::out | ios::trunc);
15     if (!fout)cout << "New file open error. ";
16     fin.read((char*)&a, sizeof(tagBITMAPFILEHEADER));
17     fin.read((char*)&b, sizeof(tagBITMAPINFOHEADER));
18     fout.write((char*)&a, sizeof(a));//写入头信息块
19     int tmp;
20     tmp = b.biWidth; b.biWidth = b.biHeight; b.biHeight = tmp;//交换宽高
21     tmp = b.biXPelsPerMeter; b.biXPelsPerMeter = b.biYPelsPerMeter; b.biYPelsPerMeter = tmp;//交换xy分辨率
22     fout.write((char*)&b, sizeof(b));//写入描述信息块
23     int pixw = 3;//1像素3字节
24     RGBTRIPLE *s = new RGBTRIPLE[b.biWidth*b.biHeight];
25     int skip = (4 - ((b.biHeight*3) % 4)) % 4;
26     for (LONG i = 0; i <b.biWidth; i++)
27         {
28             fin.read((char*)s + i*b.biHeight*3, b.biHeight*3);//转化成char 所以变成了*3……吧
29             fin.seekg(skip, ios::cur);
30         }
31     int bu_n = (4 - (b.biWidth*pixw)%4) % 4;
32     char *bu = new char[bu_n];
33     for (int i = 0; i < bu_n; i++)
34         bu[i] = 0;
35     for (LONG i = b.biHeight - 1; i >= 0; i--) {
36         for (LONG j = 0; j < b.biWidth; j++)
37             fout.write((char*)&s[j*b.biHeight+i], sizeof(tagRGBTRIPLE));
38             fout.write(bu, bu_n);
39     }
40     delete[]s;
41     delete[]bu;
42     fin.close();
43     fout.close();
44     return 0;
45 }

好像有点问题,虽然看上去好像成功了,但旋转后的图片会比原图多1kb

感觉1kb其实还挺多的,不知道是不是正常的

先存着……做错题导致我都不想做魔兽了tut

原文地址:https://www.cnblogs.com/yalphait/p/8686033.html

时间: 2024-11-02 17:58:13

18.03.31 顺时针旋转90°24位真彩色bmp图片的相关文章

C/C++ BMP(24位真彩色)图像处理(4)------图像の旋转

历经一个多月,CSDN貌似终于好像把文章列表阅读量信息归零BUG给修好了,于是乎放篇做期末大作业时写的文章上来测测效果,可别又像上次一样一发文章就又坑爹了啊! 本篇谈的是图像的旋转,不算是什么新鲜的题目了.但是现在由于很多工具如MATLAB.OPENCV等都把算法写好给用户调用,导致大多用户只知其然不知其所以然,所以回顾一下也是好的. 图像的旋转,说到底就是每个像素点绕着某个圆心旋转一定角度.如果是写代码的话,旋转的角度和圆心应该是已知的条件,我们第一个思路是根据已知条件求取出图像经过旋转后的新

【数字图像】C++8位和24位BMP位图的平滑、锐化、二值化处理,以及24位真彩图的灰度化

头文件: typedef unsigned char BYTE; typedef unsigned short WORD; typedef unsigned int DWORD; typedef long LONG; //BMP文件头(14字节) typedef struct tagBITMAPFILEHEADER { //WORD bfType;//位图文件的类型,必须为BM(在结构体中读取会发生错误,所以在函数中读取) DWORD bfSize;//位图文件的大小,以字节为单位 WORD b

【Linux下安装使用virtualenv与virtualenvwrapper】 -- 2019-08-08 18:03:31

原文: http://106.13.73.98/__/95/ virtualenv virtualenv是一个可以帮助我们管理不同Python环境的绝好工具. virtualenv是一个可以在系统中建立多个不同且相互不干扰的虚拟环境. 下面的步骤将创建两个独立的虚拟环境,并分别安装运行django1.11.11.djagno2.0. # 我们先升级pip pip3.6 install --upgrade pip # 指定清华源下载virtualenv pip3.6 install -i http

为什么24位位图(真彩色)的biSizeImage不等于(biWidth*biBitCount+31)/32*4*biHeight?

规定的,规定BMP文件的像素数据是按行存储的,而且每行的字节数必须为4的倍数,如果实际的像素数据不是4的倍数咋办?这就需要字节对齐,对齐是在一行的末尾添0以补足一行的字节数为4的倍数, ( biWidth*biBitCount+31)/32*4*biHeight//其中 biWidth是图像的宽度以像素为单位,biBitCount是每个像素的位数,如黑白图像(不是灰阶的,要么黑色要么白色)为1个像素1位,16色是4位,真彩色是24位......biHeight是指图像的高度( biWidth*b

C语言和OpenGL实现的24位色BMP解码器

我突然很喜欢发明轮子.. 早就想实现一下图片解码器和声音解码器. bmp的图片没有压缩,解码最简单,今天下午研究了一下bmp的编码,然后写了个24位色的解码器.(24位色的bmp没有调色板,8位和16位都有). 代码很简单,直接就能看懂,所以不说很多,直接贴了.. 1 #define _CRT_SECURE_NO_WARNINGS 2 3 #include <stdio.h> 4 #include <Windows.h> 5 #include <gl/freeglut.h&g

基于24位AD转换模块HX711的重量称量实验(已补充皮重存储,线性温度漂移修正)

转载:http://www.geek-workshop.com/thread-2315-1-1.html 以前在X宝上买过一个称重放大器,180+大洋.原理基本上就是把桥式拉力传感器输出的mV级信号放大到5V供单片机读取.连接实验电路的时候很完美,能实现重量的转换,但是实际组装后却发现这种A/A模块受到的干扰太严重了,包括电源的干扰,导线长短的干扰,导线位置变化的干扰,无线电的干扰等等等等……实在是恼人. 后来感觉是思路错误了,就不该用模拟信号来传输,于是决定使用A/D模块来把重量转换成数字信号

生成24位字符串ID__IdGenerator.java

此工具类用于生成24位字符串ID,唯一不重复. 直接通过 IdGenerator.get() 获取. 源码如下:(点击下载源码 - IdGenerator.java ) 1 import java.net.NetworkInterface; 2 import java.nio.ByteBuffer; 3 import java.nio.ByteOrder; 4 import java.util.Enumeration; 5 6 /** 7 * 生成24位字符串ID 8 * 9 */ 10 pub

Python学习笔记 之 递归、二维数组顺时针旋转90&#176;、正则表达式

递归.二维数组顺时针旋转90°.正则表达式 1.   递归算法是一种直接或间接调用自身算法的过程. 特点: 递归就是在过程或函数里调用自身 明确的递归结束条件,即递归出口 简洁,但是不提倡 递归次数多容易造成栈溢出 要求: 每次调用递归规模上有所减小 前一次为后一次做准备 规模较小时必须直接给出解答而不再进行递归调用 例子:递归实现二分法 1 def searchMyData(mydate,a1): 2 mid = int(len(mydate)/2) 3 if mid >= 1: 4 if m

颜色模式中8位,16位,24位,32位色彩是什么意思?会有什么区别?计算机颜色格式( 8位 16位 24位 32位色)&lt;转&gt;

颜色模式中8位,16位,24位,32位色彩是什么意思?会有什么区别简单地说这里说的位数和windows系统显示器设置中的颜色位数是一样的.表示的是能够显示出来的颜色的多少. 8位的意思是说,能够显示出来的颜色的数量有8位数.16.24都是一样的.24位的颜色数量已经很多了,叫做“真彩色”,其实32位和24位颜色数量是一样多的.32位多出来的8位数是用来表示透明度信息的,所以更加真实. 如果一有一张真彩色的照片,放到一个只有8位的显示器上的话,显示出来的效果就会很差.所以当需要的时候你就需要在低位