当前位置: 首页 > 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.dtcms.com/a/286933.html

相关文章:

  • 二分答案之第 K 小/大
  • CMake指令:常见内置命令行工具( CMake -E )
  • 乙烯丙烯酸酯橡胶市场报告:性能优势、行业现状与发展前景​
  • selenium后续!!
  • 【数据集】1970-2023年全球温室气体排放 GHG 数据集 EDGAR
  • 语音直播和视频直播的测试要点
  • 【ROS1】06-ROS通信机制——话题通信
  • OOA、OOD 与 OOP:面向对象范式的核心支柱详解
  • 接口测试的原则、用例与流程详解
  • ModelSim 配合 Makefile 搭建 Verilog 仿真工程
  • Docker-下载和安装
  • ADVB协议内容分析
  • LeetCode Hot100【6. Z 字形变换】
  • GI6E 加密GRID電碼通信SHELLCODE載入
  • CCF编程能力等级认证GESP—C++3级—20250628
  • 操作系统-处理机调度和死锁进程同步
  • 基于Qwen2.5-3B-Instruct的LoRA微调与推理实战指南
  • 多线程-3-线程同步
  • HTTPie: 开发者友好的http客户端工具
  • 数据排序
  • 特种作业操作证(制冷空调)的考试科目有哪些?
  • Xilinx Zynq:一款适用于软件定义无线电的现代片上系统
  • 使用 C# 实现移动加权平均(Weighted Moving Average)算法
  • java基础-5 : 面向对象
  • python网络爬虫(第三章/共三章:驱动浏览器窗口界面,网页元素定位,模拟用户交互(输入操作、点击操作、文件上传),浏览器窗口切换,循环爬取存储)
  • RPG60.生成可拾取物品
  • 拓扑排序/
  • 安卓Android项目 报错:系统找不到指定文件
  • Python编程:从入门到实践
  • rpa机器人流程自动化软件公司是做什么的?如何选择RPA厂商?简要介绍RPA技术、应用场景和未来趋势