当前位置: 首页 > news >正文

bmp图像操作:bmp图像保存及raw与bmp转换

1. 保存bmp图像&保存一张正弦图像到D:\1.bmp

/**********************************************
* @fileName     bmpinc.h
* @brief        对bmp文件的操作,包括:
*                   - saveBmp:保存bmp文件
*                   - SaveSinbmp:保存正弦bmp图像
*               声明了bmp的文件头信息和位图信息结构体,在保存bmp文件时使用到了这些结构体
* @author       
* @date         
**********************************************/#ifndef BMPINC_H
#define BMPINC_H#include <iostream>
#include <math.h>
#define NDEBUG
#include <assert.h>#pragma pack(2)  // 字节对齐方式为2字节对齐typedef long LONG;
typedef unsigned long DWORD;
typedef unsigned short WORD;
typedef unsigned char uchar;
typedef unsigned char BYTE;/*24位或32位图的情况下位图文件从文件头开始偏移54个字节就是位图数据了。* bmp文件按先后顺序分为4部分* bmp文件头 14bytes:2bytes说明文件类型 + 4bytes文件的大小 +* 2bytes保留位 + 2bytes保留位 + 4bytes字节偏移量;* 位图信息头 40bytes:4bytes位图信息结构所需要的字节数 + 4bytes图像宽度 + 4bytes图像高度*                   + 2bytes颜色平面数总是设为1 + 2bytes比特像素数值通常为1,4,8,16,24或32*                         + 4bytes压缩类型 + 4bytes图像的大小*                       + 4bytes水平分辨率 + 4bytes垂直分辨率*                         + 4bytes颜色索引数 + 4bytes对图像显示有重要影响的颜色索引的数目0表示都重要* 调色板* 位图数据*
*//// 文件信息
typedef struct
{WORD bfType;  // 文件类型,bmp图片默认为0x4D42 2bytesDWORD bfSize;  // 文件大小 4bytesWORD bfReserved1;  // 保留位 2bytesWORD bfReserved2;  // 保留位 2bytesDWORD bfOffBits;  // 偏移量 4bytes}BMPFILEHEADER_T;//文件信息// 数据信息
typedef struct
{DWORD biSize;  // 位图信息结构字节数,4bytesLONG biWidth;  // 位图宽度,4bytesLONG biHeight;  // 位图高度,4bytesWORD biPlanes;  // 颜色平面数,默认为1,2bytesWORD biBitCount;  // 比特像素数值,1/4/8/16,2bytesDWORD biCompression;  // 压缩类型,4bytesDWORD biSizeImage;  // 图像大小,4bytesLONG biXPelsPerMeter;  // 水平分辨率,4bytesLONG biYPelsPerMeter;  // 垂直分辨率,4bytesDWORD biClrUsed;  // 颜色索引数,4bytesDWORD biClrImportant;  // 对图像显示有重要影响的颜色索引的数目,0表示都重要,4bytes
}BMPINFOHEADER_T;//数据信息///
/// \brief saveBmp: 保存bmp文件
/// \param src:bmp buffer
/// \param bmpfile:bmp文件名
/// \param width:图片宽
/// \param height:图片高
///
void saveBmp(const uchar* src,const char *bmpfile,int width,int height)
{assert(src != nullptr);//要保存的数据分别有文件头信息,数据信息,数据,图片长宽int iSize = width*height*3*sizeof(uchar);  // 图片信息字节数int iBmpFileSize = sizeof(BMPFILEHEADER_T);  // 文件头信息字节数int iBmpInfoSize = sizeof(BMPINFOHEADER_T);  // 数据信息字节数//保存文件头信息BMPFILEHEADER_T bfh;  // 文件头信息bfh.bfType = (WORD)0x4D42;bfh.bfSize = iSize*iBmpFileSize*iBmpInfoSize;bfh.bfReserved1 = 0;bfh.bfReserved2 = 0;bfh.bfOffBits = iBmpFileSize + iBmpInfoSize;// 数据信息BMPINFOHEADER_T bih;bih.biSize = iBmpInfoSize;bih.biWidth = width;bih.biHeight = height;bih.biPlanes = 1;bih.biBitCount = 24;bih.biCompression = 0;bih.biSizeImage = iSize;bih.biXPelsPerMeter = 0;bih.biYPelsPerMeter = 0;bih.biClrUsed = 0;bih.biClrImportant = 0;FILE *fp = nullptr;if(!(fp = fopen(bmpfile,"wb"))){printf("open file fail");return;}fwrite(&bfh,8,1,fp);fwrite(&bfh.bfReserved2,2,1,fp);fwrite(&bfh.bfOffBits,4,1,fp);fwrite(&bih,iBmpInfoSize,1,fp);fwrite(src,iSize,1,fp);fclose(fp);
}///
/// \brief SaveSinbmp保存正弦函数图像到D:\1.BMP
///
void SaveSinbmp()
{const int iWidth = 800;const int iHeight = 600;const int iSize = iWidth*iHeight*3;//保存文件头信息BMPFILEHEADER_T bfh;bfh.bfType = (WORD)0x4D42;bfh.bfSize = iSize*sizeof(BMPFILEHEADER_T)*sizeof(BMPINFOHEADER_T);bfh.bfReserved1 = 0;bfh.bfReserved2 = 0;bfh.bfOffBits = sizeof(BMPFILEHEADER_T) + sizeof(BMPINFOHEADER_T);//位图信息BMPINFOHEADER_T bih;bih.biSize = sizeof(BMPINFOHEADER_T);bih.biWidth = iWidth;bih.biHeight = iHeight;bih.biPlanes = 3;bih.biBitCount = 24;bih.biCompression = 0;bih.biSizeImage = iSize;bih.biXPelsPerMeter = 0;bih.biYPelsPerMeter = 0;bih.biClrUsed = 0;bih.biClrImportant = 0;int iIndex = 0;double y = 0.0;BYTE *bits = (BYTE*)malloc(iSize);memset(bits,0xff,iSize);for(double x=0;x<800;x+=0.5){y = sin(x/100.0)*200+300;iIndex = (int)y*800*3+(int)x*3;bits[iIndex+0] = 0;bits[iIndex+1] = 0;bits[iIndex+2] = 255;}
//    for(int x = 0;x<iWidth;x+=1)
//    {
//        bits[iHeight/2*iWidth+x] = 0;
//        bits[iHeight/2*iWidth+x+1] = 0;
//        bits[iHeight/2*iWidth+x+2] = 0;
//    }
//    for(int y = 0;y<iHeight;y+=1)
//    {
//        bits[iWidth/2+y*iWidth] = 0;
//        bits[iWidth/2+y*iWidth+1] = 0;
//        bits[iWidth/2+y*iWidth+2] = 0;
//    }FILE *output = fopen("D:/1.bmp","wb");fwrite(&bfh,sizeof(BMPFILEHEADER_T),1,output);fwrite(&bih,sizeof(BMPINFOHEADER_T),1,output);fwrite(bits,iSize,1,output);fclose(output);
}
#endif // BMPINC_H

2. raw10转换为raw8


///
/// \brief Raw10ToRaw8:raw10转raw8
/// \param src:raw10 buffer
/// \param dst:raw8 buffer
/// \param w:raw 宽
/// \param h:raw高
///
void Raw10ToRaw8(const ushort* src,uchar * dst,int w,int h)
{for(int y=0;y<h;y+=1)for(int x=0;x<w;x+=1)dst[y*w+x] = (uchar)((src[y*w+x]>>2)&0xff);}

3. raw转换为rgb24

#include <iostream>typedef unsigned char BYTE;// bayer raw格式
enum E_BayerRawFormat
{FORMAT_GRBG = 0,FORMAT_BGGR,FORMAT_RGGB,FORMAT_GBRG,FORMAT_NULL,
};// 图像结构体
struct ST_ImageInfo
{int width;  // 图像宽int height;  // 图像高unsigned char *buffer;  // 图像buffer
};///
/// \brief RAWToRGB24_BGGR/RAWToRGB24_RGGB/RAWToRGB24_GRBG/RAWToRGB24_GBRG:bayerraw 转bmp,线性插值算法实现转换
/// \param src:raw图buffer
/// \param dst:bmp buffer
/// \param w:raw宽
/// \param h:raw高
/// \param bit:raw bits,一般是8或10或12或16
///
void RAWToRGB24_BGGR(unsigned short* src,BYTE* dst,int w,int h,int bit)
{// B Gb B Gb B Gb B Gb// Gr R Gr R Gr R Gr R// B Gb B Gb B Gb B Gb// Gr R Gr R Gr R Gr Rint iBits = bit-8;int iGrPos = 0;int iGbPos = 0;int iRPos = 0;int iBPos = 0;//中心部分for(int y = 1;y<(h-1);y+=2){for(int x = 1;x<(w-1);x+=2){iRPos = y*w+x;iGrPos = y*w+x+1;iGbPos = (y+1)*w+x;iBPos = (y+1)*w+x+1;//Rdst[iRPos*3] = (BYTE)((src[iRPos-1-w] + src[iRPos-1+w] + src[iRPos+1-w] + src[iRPos+1+w])/4 >>iBits);dst[iRPos*3+1] = (BYTE)((src[iRPos-1] + src[iRPos+1] + src[iRPos-w] + src[iRPos+w])/4 >>iBits);dst[iRPos*3+2] = (BYTE)(src[iRPos] >>iBits);//Grdst[iGrPos*3] = (BYTE)((src[iGrPos-w] + src[iGrPos+w])/2 >>iBits);dst[iGrPos*3+1] = (BYTE)((src[iGrPos] + src[iGrPos+1-w])/2 >>iBits);dst[iGrPos*3+2] = (BYTE)((src[iGrPos-1] + src[iGrPos+1])/2 >>iBits);//Gbdst[iGbPos*3] = (BYTE)((src[iGbPos-1] + src[iGbPos+1])/2 >>iBits);dst[iGbPos*3+1] = (BYTE)((src[iGbPos] + src[iGbPos+1-w])/2 >>iBits);dst[iGbPos*3+2] = (BYTE)((src[iGbPos-w] + src[iGbPos+w])/2 >>iBits);//Bdst[iBPos*3] = (BYTE)(src[iBPos] >>iBits);dst[iBPos*3+1] = (BYTE)((src[iBPos-1] + src[iBPos+1] + src[iBPos-w] + src[iBPos+w])/4 >>iBits);dst[iBPos*3+2] = (BYTE)((src[iBPos-1-w] + src[iBPos-1+w] + src[iBPos+1-w] + src[iBPos+1+w])/4 >>iBits);}}//上下for(int x=1;x<(w-1);x+=2){iGbPos = x;iBPos = x+1;iRPos = (h-1)*w +x;iGrPos = (h-1)*w +x+1;//Gbdst[iGbPos*3] = (BYTE)((src[iGbPos-1] + src[iGbPos+1])/2 >>iBits);dst[iGbPos*3+1] = (BYTE)(src[iGbPos] >>iBits);dst[iGbPos*3+2] = (BYTE)(src[iGbPos+w] >>iBits);//Bdst[iBPos*3] = (BYTE)(src[iBPos] >>iBits);dst[iBPos*3+1] = (BYTE)((src[iBPos-1] + src[iBPos+1] + src[iBPos+w])/3 >>iBits);dst[iBPos*3+2] = (BYTE)((src[iBPos+w-1] + src[iBPos+w+1])/2 >>iBits);//Rdst[iRPos*3] = (BYTE)((src[iRPos-w-1] + src[iRPos-w+1])/2 >>iBits);dst[iRPos*3+1] = (BYTE)((src[iRPos-1] + src[iRPos+1] + src[iRPos-w])/3 >>iBits);dst[iRPos*3+2] = (BYTE)(src[iRPos] >>iBits);//Grdst[iGrPos*3] = (BYTE)(src[iGrPos-w] >>iBits);dst[iGrPos*3+1] = (BYTE)(src[iGrPos] >>iBits);dst[iGrPos*3+2] = (BYTE)((src[iGrPos-1] + src[iGrPos+1])/2 >>iBits);}//左右for(int y = 1; y<(h-1); y+=2){iGrPos = y*w;iBPos = (y+1)*w;iRPos = (y+1)*w-1;iGbPos = (y+2)*w-1;//Grdst[iGrPos*3] = (BYTE)((src[iGrPos-w] + src[iGrPos+w])/2 >>iBits);dst[iGrPos*3+1] = (BYTE)(src[iGrPos] >>iBits);dst[iGrPos*3+2] = (BYTE)(src[iGrPos+1] >>iBits);//Bdst[iBPos*3] = (BYTE)(src[iBPos] >>iBits);dst[iBPos*3+1] = (BYTE)((src[iBPos+1] + src[iBPos-w] + src[iBPos+w])/3 >>iBits);dst[iBPos*3+2] = (BYTE)((src[iBPos+1-w] + src[iBPos+1+w])/2 >>iBits);//Gbdst[iGbPos*3] = (BYTE)(src[iGbPos-1] >>iBits);dst[iGbPos*3+1] = (BYTE)(src[iGrPos] >>iBits);dst[iGbPos*3+2] = (BYTE)((src[iGrPos-w] + src[iGrPos+w])/2 >>iBits);//Rdst[iRPos*3] = (BYTE)((src[iRPos-1-w] + src[iRPos-1+w])/2 >>iBits);dst[iRPos*3+1] = (BYTE)((src[iRPos-1] + src[iRPos-w] + src[iRPos+w])/3 >>iBits);dst[iRPos*3+2] = (BYTE)(src[iRPos] >>iBits);}//左上角dst[0] = (BYTE)(src[0] >>iBits);dst[1] = (BYTE)((src[1]+src[w])/2 >>iBits);dst[2] = (BYTE)(src[w+1] >>iBits);//右上角dst[(w-1)*3] = (BYTE)(src[w-1-1] >>iBits);dst[(w-1)*3+1] = (BYTE)(src[w-1] >>iBits);dst[(w-1)*3+2] = (BYTE)(src[w-1+w] >>iBits);//左下角dst[(h-1)*w*3] = (BYTE)(src[(h-1)*w-w] >>iBits);dst[(h-1)*w*3+1] = (BYTE)((src[(h-1)*w] + src[(h-1)*w+1-w])/2 >>iBits);dst[(h-1)*w*3+2] = (BYTE)(src[(h-1)*w+1] >>iBits);//右下角dst[(h*w-1)*3] = (BYTE)(src[(h*w-1)-1-w] >>iBits);dst[(h*w-1)*3+1] = (BYTE)((src[(h*w-1)-1] + src[(h*w-1)-w])/2 >>iBits);dst[(h*w-1)*3+2] = (BYTE)(src[h*w-1] >>iBits);
}
void RAWToRGB24_RGGB(unsigned short* src,BYTE* dst,int w,int h,int bit)
{// /*//  * R Gr R Gr R Gr R Gr R Gr//  * Gb B Gb B Gb B Gb B Gb B//  * R Gr R Gr R Gr R Gr R Gr//  * Gb B Gb B Gb B Gb B Gb B// */int iBits = bit-8;int iGrPos = 0;int iGbPos = 0;int iRPos = 0;int iBPos = 0;//中心部分for(int y = 1;y<(h-1);y+=2){for(int x = 1;x<(w-1);x+=2){iBPos = y*w+x;iGbPos = y*w+x+1;iGrPos = (y+1)*w+x;iRPos = (y+1)*w+x+1;//B BGRdst[iBPos*3] = (BYTE)(src[iBPos] >>iBits);dst[iBPos*3+1] = (BYTE)((src[iBPos-1] + src[iBPos+1] + src[iBPos-w] + src[iBPos+w])/4 >>iBits);dst[iBPos*3+2] = (BYTE)((src[iBPos-1-w] + src[iBPos-1+w] + src[iBPos+1-w] + src[iBPos+1+w])/4 >>iBits);//Gbdst[iGbPos*3] = (BYTE)((src[iGbPos-1] + src[iGbPos+1])/2 >>iBits);dst[iGbPos*3+1] = (BYTE)((src[iGbPos] + src[iGbPos+1-w])/2 >>iBits);dst[iGbPos*3+2] = (BYTE)((src[iGbPos-w] + src[iGbPos+w])/2 >>iBits);//Grdst[iGrPos*3] = (BYTE)((src[iGrPos-w] + src[iGrPos+w])/2 >>iBits);dst[iGrPos*3+1] = (BYTE)((src[iGrPos] + src[iGrPos+1-w])/2 >>iBits);dst[iGrPos*3+2] = (BYTE)((src[iGrPos-1] + src[iGrPos+1])/2 >>iBits);//Rdst[iRPos*3] = (BYTE)((src[iRPos-1-w] + src[iRPos-1+w] + src[iRPos+1-w] + src[iRPos+1+w])/4 >>iBits);dst[iRPos*3+1] = (BYTE)((src[iRPos-1] + src[iRPos+1] + src[iRPos-w] + src[iRPos+w])/4 >>iBits);dst[iRPos*3+2] = (BYTE)(src[iRPos] >>iBits);}}//上下for(int x=1;x<(w-1);x+=2){iGrPos = x;iRPos = x+1;iBPos = (h-1)*w +x;iGbPos = (h-1)*w +x+1;//Gr BGRdst[iGrPos*3] = (BYTE)(src[iGrPos+w] >>iBits);dst[iGrPos*3+1] = (BYTE)(src[iGrPos] >>iBits);dst[iGrPos*3+2] = (BYTE)((src[iGrPos-1] + src[iGrPos+1])/2 >>iBits);//Rdst[iRPos*3] = (BYTE)((src[iRPos+w-1] + src[iRPos+w+1])/2 >>iBits);dst[iRPos*3+1] = (BYTE)((src[iRPos-1] + src[iRPos+1] + src[iRPos+w])/3 >>iBits);dst[iRPos*3+2] = (BYTE)(src[iRPos] >>iBits);//Gbdst[iGbPos*3] = (BYTE)((src[iGbPos-1] + src[iGbPos+1])/2 >>iBits);dst[iGbPos*3+1] = (BYTE)(src[iGbPos] >>iBits);dst[iGbPos*3+2] = (BYTE)(src[iGbPos-w] >>iBits);//Bdst[iBPos*3] = (BYTE)(src[iBPos] >>iBits);dst[iBPos*3+1] = (BYTE)((src[iBPos-1] + src[iBPos+1] + src[iBPos-w])/3 >>iBits);dst[iBPos*3+2] = (BYTE)((src[iBPos-w-1] + src[iBPos-w+1])/2 >>iBits);}//左右for(int y = 1; y<(h-1); y+=2){iGbPos = y*w;iRPos = (y+1)*w;iBPos = (y+1)*w-1;iGrPos = (y+2)*w-1;//Grdst[iGrPos*3] = (BYTE)((src[iGrPos-w] + src[iGrPos+w])/2 >>iBits);dst[iGrPos*3+1] = (BYTE)(src[iGrPos] >>iBits);dst[iGrPos*3+2] = (BYTE)(src[iGrPos-1] >>iBits);//Bdst[iBPos*3] = (BYTE)(src[iBPos] >>iBits);dst[iBPos*3+1] = (BYTE)((src[iBPos-1] + src[iBPos-w] + src[iBPos+w])/3 >>iBits);dst[iBPos*3+2] = (BYTE)((src[iBPos-1-w] + src[iBPos-1+w])/2 >>iBits);//Gbdst[iGbPos*3] = (BYTE)(src[iGbPos+1] >>iBits);dst[iGbPos*3+1] = (BYTE)(src[iGrPos] >>iBits);dst[iGbPos*3+2] = (BYTE)((src[iGrPos-w] + src[iGrPos+w])/2 >>iBits);//Rdst[iRPos*3] = (BYTE)((src[iRPos+1-w] + src[iRPos+1+w])/2 >>iBits);dst[iRPos*3+1] = (BYTE)((src[iRPos+1] + src[iRPos-w] + src[iRPos+w])/3 >>iBits);dst[iRPos*3+2] = (BYTE)(src[iRPos] >>iBits);}//左上角dst[0] = (BYTE)(src[w+1] >>iBits);dst[1] = (BYTE)((src[1]+src[w])/2 >>iBits);dst[2] = (BYTE)(src[0] >>iBits);//右上角dst[(w-1)*3] = (BYTE)(src[w-1+w] >>iBits);dst[(w-1)*3+1] = (BYTE)(src[w-1] >>iBits);dst[(w-1)*3+2] = (BYTE)(src[w-1-2] >>iBits);//左下角dst[(h-1)*w*3] = (BYTE)(src[(h-1)*w+1] >>iBits);dst[(h-1)*w*3+1] = (BYTE)((src[(h-1)*w] + src[(h-1)*w+1-w])/2 >>iBits);dst[(h-1)*w*3+2] = (BYTE)(src[(h-1)*w-w] >>iBits);//右下角dst[(h*w-1)*3] = (BYTE)(src[h*w-1] >>iBits);dst[(h*w-1)*3+1] = (BYTE)((src[(h*w-1)-1] + src[(h*w-1)-w])/2 >>iBits);dst[(h*w-1)*3+2] = (BYTE)(src[h*w-1 -1-w] >>iBits);
}
void RAWToRGB24_GRBG(unsigned short* src,BYTE* dst,int w,int h,int bit)
{// /*//  * Gr R Gr R Gr R Gr R//  * B Gb B Gb B Gb B Gb//  * Gr R Gr R Gr R Gr R//  * B Gb B Gb B Gb B Gb// */int iBits = bit-8;int iGrPos = 0;int iGbPos = 0;int iRPos = 0;int iBPos = 0;//中心部分for(int y = 1;y<(h-1);y+=2){for(int x = 1;x<(w-1);x+=2){iGbPos = y*w+x;iBPos = y*w+x+1;iRPos = (y+1)*w+x;iGrPos = (y+1)*w+x+1;//B BGRdst[iBPos*3] = (BYTE)(src[iBPos] >>iBits);dst[iBPos*3+1] = (BYTE)((src[iBPos-1] + src[iBPos+1] + src[iBPos-w] + src[iBPos+w])/4 >>iBits);dst[iBPos*3+2] = (BYTE)((src[iBPos-1-w] + src[iBPos-1+w] + src[iBPos+1-w] + src[iBPos+1+w])/4 >>iBits);//Gbdst[iGbPos*3] = (BYTE)((src[iGbPos-1] + src[iGbPos+1])/2 >>iBits);dst[iGbPos*3+1] = (BYTE)((src[iGbPos] + src[iGbPos+1-w])/2 >>iBits);dst[iGbPos*3+2] = (BYTE)((src[iGbPos-w] + src[iGbPos+w])/2 >>iBits);//Grdst[iGrPos*3] = (BYTE)((src[iGrPos-w] + src[iGrPos+w])/2 >>iBits);dst[iGrPos*3+1] = (BYTE)((src[iGrPos] + src[iGrPos+1-w])/2 >>iBits);dst[iGrPos*3+2] = (BYTE)((src[iGrPos-1] + src[iGrPos+1])/2 >>iBits);//Rdst[iRPos*3] = (BYTE)((src[iRPos-1-w] + src[iRPos-1+w] + src[iRPos+1-w] + src[iRPos+1+w])/4 >>iBits);dst[iRPos*3+1] = (BYTE)((src[iRPos-1] + src[iRPos+1] + src[iRPos-w] + src[iRPos+w])/4 >>iBits);dst[iRPos*3+2] = (BYTE)(src[iRPos] >>iBits);}}//上下for(int x=1;x<(w-1);x+=2){iRPos = x;iGrPos = x+1;iGbPos = (h-1)*w +x;iBPos = (h-1)*w +x+1;//Gr BGRdst[iGrPos*3] = (BYTE)(src[iGrPos+w] >>iBits);dst[iGrPos*3+1] = (BYTE)(src[iGrPos] >>iBits);dst[iGrPos*3+2] = (BYTE)((src[iGrPos-1] + src[iGrPos+1])/2 >>iBits);//Rdst[iRPos*3] = (BYTE)((src[iRPos+w-1] + src[iRPos+w+1])/2 >>iBits);dst[iRPos*3+1] = (BYTE)((src[iRPos-1] + src[iRPos+1] + src[iRPos+w])/3 >>iBits);dst[iRPos*3+2] = (BYTE)(src[iRPos] >>iBits);//Gbdst[iGbPos*3] = (BYTE)((src[iGbPos-1] + src[iGbPos+1])/2 >>iBits);dst[iGbPos*3+1] = (BYTE)(src[iGbPos] >>iBits);dst[iGbPos*3+2] = (BYTE)(src[iGbPos-w] >>iBits);//Bdst[iBPos*3] = (BYTE)(src[iBPos] >>iBits);dst[iBPos*3+1] = (BYTE)((src[iBPos-1] + src[iBPos+1] + src[iBPos-w])/3 >>iBits);dst[iBPos*3+2] = (BYTE)((src[iBPos-w-1] + src[iBPos-w+1])/2 >>iBits);}//左右for(int y = 1; y<(h-1); y+=2){iBPos = y*w;iGrPos = (y+1)*w;iGbPos = (y+1)*w-1;iRPos = (y+2)*w-1;//Grdst[iGrPos*3] = (BYTE)((src[iGrPos-w] + src[iGrPos+w])/2 >>iBits);dst[iGrPos*3+1] = (BYTE)((src[iGrPos] + src[iGrPos+1-w])/2 >>iBits);dst[iGrPos*3+2] = (BYTE)(src[iGrPos+1] >>iBits);//Bdst[iBPos*3] = (BYTE)(src[iBPos] >>iBits);dst[iBPos*3+1] = (BYTE)((src[iBPos+1] + src[iBPos-w] + src[iBPos+w])/3 >>iBits);dst[iBPos*3+2] = (BYTE)((src[iBPos+1-w] + src[iBPos+1+w])/2 >>iBits);//Gbdst[iGbPos*3] = (BYTE)(src[iGbPos-1] >>iBits);dst[iGbPos*3+1] = (BYTE)(src[iGrPos] >>iBits);dst[iGbPos*3+2] = (BYTE)((src[iGrPos-w] + src[iGrPos+w])/2 >>iBits);//Rdst[iRPos*3] = (BYTE)((src[iRPos-1-w] + src[iRPos-1+w])/2 >>iBits);dst[iRPos*3+1] = (BYTE)((src[iRPos+1] + src[iRPos-w] + src[iRPos+w])/3 >>iBits);dst[iRPos*3+2] = (BYTE)(src[iRPos] >>iBits);}//左上角dst[0] = (BYTE)(src[w] >>iBits);dst[1] = (BYTE)(src[0] >>iBits);dst[2] = (BYTE)(src[1] >>iBits);//右上角dst[(w-1)*3] = (BYTE)(src[2*w-2] >>iBits);dst[(w-1)*3+1] = (BYTE)((src[w-2] + src[2*w-1])/2 >>iBits);dst[(w-1)*3+2] = (BYTE)(src[w-1] >>iBits);//左下角dst[(h-1)*w*3] = (BYTE)(src[(h-1)*w] >>iBits);dst[(h-1)*w*3+1] = (BYTE)((src[(h-1)*w+1] + src[(h-1)*w-w])/2 >>iBits);dst[(h-1)*w*3+2] = (BYTE)(src[(h-1)*w-w+1] >>iBits);//右下角dst[(h*w-1)*3] = (BYTE)(src[h*w-1-1] >>iBits);dst[(h*w-1)*3+1] = (BYTE)(src[h*w-1] >>iBits);dst[(h*w-1)*3+2] = (BYTE)(src[h*w-1-w] >>iBits);
}
void RAWToRGB24_GBRG(unsigned short* src,BYTE* dst,int w,int h,int bit)
{// /*//  * Gb B Gb B Gb B Gb B//  * R Gr R Gr R Gr R Gr//  * Gb B Gb B Gb B Gb B//  * R Gr R Gr R Gr R Gr// */int iBits = bit-8;int iGrPos = 0;int iGbPos = 0;int iRPos = 0;int iBPos = 0;//中心部分for(int y = 1;y<(h-1);y+=2){for(int x = 1;x<(w-1);x+=2){iGrPos = y*w+x;iRPos = y*w+x+1;iBPos = (y+1)*w+x;iGbPos = (y+1)*w+x+1;//B BGRdst[iBPos*3] = (BYTE)(src[iBPos] >>iBits);dst[iBPos*3+1] = (BYTE)((src[iBPos-1] + src[iBPos+1] + src[iBPos-w] + src[iBPos+w])/4 >>iBits);dst[iBPos*3+2] = (BYTE)((src[iBPos-1-w] + src[iBPos-1+w] + src[iBPos+1-w] + src[iBPos+1+w])/4 >>iBits);//Gbdst[iGbPos*3] = (BYTE)((src[iGbPos-1] + src[iGbPos+1])/2 >>iBits);dst[iGbPos*3+1] = (BYTE)((src[iGbPos] + src[iGbPos+1-w])/2 >>iBits);dst[iGbPos*3+2] = (BYTE)((src[iGbPos-w] + src[iGbPos+w])/2 >>iBits);//Grdst[iGrPos*3] = (BYTE)((src[iGrPos-w] + src[iGrPos+w])/2 >>iBits);dst[iGrPos*3+1] = (BYTE)((src[iGrPos] + src[iGrPos+1-w])/2 >>iBits);dst[iGrPos*3+2] = (BYTE)((src[iGrPos-1] + src[iGrPos+1])/2 >>iBits);//Rdst[iRPos*3] = (BYTE)((src[iRPos-1-w] + src[iRPos-1+w] + src[iRPos+1-w] + src[iRPos+1+w])/4 >>iBits);dst[iRPos*3+1] = (BYTE)((src[iRPos-1] + src[iRPos+1] + src[iRPos-w] + src[iRPos+w])/4 >>iBits);dst[iRPos*3+2] = (BYTE)(src[iRPos] >>iBits);}}//上下for(int x=1;x<(w-1);x+=2){iBPos = x;iGbPos = x+1;iGrPos = (h-1)*w +x;iRPos = (h-1)*w +x+1;//Gr BGRdst[iGrPos*3] = (BYTE)(src[iGrPos-w] >>iBits);dst[iGrPos*3+1] = (BYTE)((src[iGrPos] + src[iGrPos+1-w])/2 >>iBits);dst[iGrPos*3+2] = (BYTE)((src[iGrPos-1] + src[iGrPos+1])/2 >>iBits);//Rdst[iRPos*3] = (BYTE)((src[iRPos-w-1] + src[iRPos-w+1])/2 >>iBits);dst[iRPos*3+1] = (BYTE)((src[iRPos-1] + src[iRPos+1] + src[iRPos-w])/3 >>iBits);dst[iRPos*3+2] = (BYTE)(src[iRPos] >>iBits);//Gbdst[iGbPos*3] = (BYTE)((src[iGbPos-1] + src[iGbPos+1])/2 >>iBits);dst[iGbPos*3+1] = (BYTE)(src[iGbPos] >>iBits);dst[iGbPos*3+2] = (BYTE)(src[iGbPos+w] >>iBits);//Bdst[iBPos*3] = (BYTE)(src[iBPos] >>iBits);dst[iBPos*3+1] = (BYTE)((src[iBPos-1] + src[iBPos+1] + src[iBPos+w])/3 >>iBits);dst[iBPos*3+2] = (BYTE)((src[iBPos+w-1] + src[iBPos+w+1])/2 >>iBits);}//左右for(int y = 1; y<(h-1); y+=2){iRPos = y*w;iGbPos = (y+1)*w;iGrPos = (y+1)*w-1;iBPos = (y+2)*w-1;//Grdst[iGrPos*3] = (BYTE)((src[iGrPos-w] + src[iGrPos+w])/2 >>iBits);dst[iGrPos*3+1] = (BYTE)(src[iGrPos] >>iBits);dst[iGrPos*3+2] = (BYTE)(src[iGrPos-1] >>iBits);//Bdst[iBPos*3] = (BYTE)(src[iBPos] >>iBits);dst[iBPos*3+1] = (BYTE)((src[iBPos-1] + src[iBPos-w] + src[iBPos+w])/3 >>iBits);dst[iBPos*3+2] = (BYTE)((src[iBPos-1-w] + src[iBPos-1+w])/2 >>iBits);//Gbdst[iGbPos*3] = (BYTE)(src[iGbPos+1] >>iBits);dst[iGbPos*3+1] = (BYTE)((src[iGrPos] + src[iGrPos+1-w])/2 >>iBits);dst[iGbPos*3+2] = (BYTE)((src[iGrPos-w] + src[iGrPos+w])/2 >>iBits);//Rdst[iRPos*3] = (BYTE)((src[iRPos+1-w] + src[iRPos+1+w])/2 >>iBits);dst[iRPos*3+1] = (BYTE)((src[iRPos+1] + src[iRPos-w] + src[iRPos+w])/3 >>iBits);dst[iRPos*3+2] = (BYTE)(src[iRPos] >>iBits);}//左上角dst[0] = (BYTE)(src[1] >>iBits);dst[1] = (BYTE)(src[0] >>iBits);dst[2] = (BYTE)(src[w] >>iBits);//右上角dst[(w-1)*3] = (BYTE)(src[w-1] >>iBits);dst[(w-1)*3+1] = (BYTE)((src[w-2] + src[2*w-1])/2 >>iBits);dst[(w-1)*3+2] = (BYTE)(src[2*w-2] >>iBits);//左下角dst[(h-1)*w*3] = (BYTE)(src[(h-1)*w + 1-w] >>iBits);dst[(h-1)*w*3+1] = (BYTE)((src[(h-1)*w+1] + src[(h-1)*w-w])/2 >>iBits);dst[(h-1)*w*3+2] = (BYTE)(src[(h-1)*w] >>iBits);//右下角dst[(h*w-1)*3] = (BYTE)(src[h*w-1-w] >>iBits);dst[(h*w-1)*3+1] = (BYTE)(src[h*w-1] >>iBits);dst[(h*w-1)*3+2] = (BYTE)(src[h*w-1-1] >>iBits);
}///
/// \brief RAWToRGB24_Linear_Interpolation:raw转bmp,线性插值实现
/// \param src:raw buffer
/// \param dst:bmp buffer
/// \param w:raw宽
/// \param h:raw高
/// \param format:raw bayer格式:FORMAT_BGGR、FORMAT_RGGB、FORMAT_GRBG、FORMAT_GBRG
/// \param bit:raw bits,一般是8或10或12或16
///
void RAWToRGB24_Linear_Interpolation(unsigned short* src,BYTE* dst,int w,int h,BYTE format,int bit)
{if((nullptr == src) || (nullptr == dst))return;switch (format) {case FORMAT_BGGR:RAWToRGB24_BGGR(src,dst,w,h,bit);break;case FORMAT_RGGB:RAWToRGB24_RGGB(src,dst,w,h,bit);break;case FORMAT_GRBG:RAWToRGB24_GRBG(src,dst,w,h,bit);break;case FORMAT_GBRG:RAWToRGB24_GBRG(src,dst,w,h,bit);break;case FORMAT_NULL:printf("No format.\n");break;}
}///
/// \brief LinearImage:线性插值,raw bayer为RGGB
/// \param src
/// \param dst
///
void LinearImage(ST_ImageInfo &src,ST_ImageInfo &dst)
{// * R G R G R G R G// * G B G B G B G B// * R G R G R G R G// * G B G B G B G B// * R G R G R G R G// * G B G B G B G Bint iDstWidth = dst.width;int iDstHeight = dst.height;unsigned char* pusSrc = (unsigned char*)(src.buffer);int width = src.width;int hight = src.height;for(int y = 0;y<(iDstHeight);++y)//目标图像的高和宽{for(int x = 0;x<(iDstWidth);++x){double dSrcX = x*(1.0*width/iDstWidth);int iSrcX = (int)dSrcX;double dSrcFractionalX = dSrcX - iSrcX;double dSrcY = y*(1.0*hight/iDstHeight);int iSrcY = (int)dSrcY;double dSrcFractionalY = dSrcY - iSrcY;dst.buffer[y*iDstWidth+x] = (1-dSrcFractionalX)*(1-dSrcFractionalY)*pusSrc[iSrcY*width + iSrcX] +(1-dSrcFractionalX)*dSrcFractionalY*pusSrc[(iSrcY+1)*width+iSrcX] +dSrcFractionalX*(1-dSrcFractionalY)*pusSrc[iSrcY*width+iSrcX+1] +dSrcFractionalX*dSrcFractionalY*pusSrc[(iSrcY+1)*width+iSrcX+1];}}
}
http://www.xdnf.cn/news/1141489.html

相关文章:

  • 内容生产的3种方式 最佳实践:人 / 人+机 / 机
  • Win11安装Docker,并使用Docker安装RabbitMQ
  • 14-链路聚合
  • 如何上传github(解决git的时候输入正确的账号密码,但提示认证失败)
  • react/vue vite ts项目中,自动引入路由文件、 import.meta.glob动态引入路由 无需手动引入
  • 7月18日总结
  • Java全栈工程师面试实录:从Spring Boot到AI大模型的深度技术解析
  • 基于K8s ingress灰度发布配置
  • 【Docker#2】容器历史发展 | 虚拟化实现方式
  • Java大厂面试实录:从Spring Boot到AI微服务架构的深度解析
  • [源力觉醒 创作者计划]_文心一言 4.5开源深度解析:性能狂飙 + 中文专精
  • 如何快速下载 MT4 交易平台
  • div和span区别
  • 智象科技赋能金融、证券行业 IT 运维
  • Git使用与管理
  • mac mlx大模型框架的安装和使用
  • BIST会对锁步核做什么?
  • 【PTA数据结构 | C语言版】根据后序和中序遍历输出前序遍历
  • Kubernetes (k8s)、Rancher 和 Podman 的异同点分析
  • Copula 回归与结构方程模型:R 语言构建多变量因果关系网络
  • 异世界历险之数据结构世界(排序(插入,希尔,堆排))
  • mysql 性能优化入门
  • 搜索引擎优化全攻略:提升百度排名优化
  • JAVA 使用Apache POI合并Word文档并保留批注的实现
  • 前端下载文件并按GBK编码解析内容
  • ADVB协议内容分析
  • MyBatis 动态 SQL:让 SQL 语句随条件灵活变化
  • 【科研绘图系列】R语言绘制分组箱线图
  • 【锂电池剩余寿命预测】TCN时间卷积神经网络锂电池剩余寿命预测(Pytorch完整源码和数据)
  • 基于vue框架的房屋租赁系统设计与实现zrd8i(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。