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.pswp.cn/bicheng/89670.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/89670.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/89670.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

SpringAI——提示詞(Prompt)、提示詞模板(PromptTemplate)

Prompt 是引導 AI 模型生成特定輸出的輸入格式&#xff0c;Prompt 的設計和措辭會顯著影響模型的響應。最開始Prompt只是單純的文本文字&#xff0c;后面可以包含占位符&#xff0c;可以識別消息的角色。比如包含占位符的Prompt,也就是我們講的消息模板(PromptTemplate)&#x…

【深度學習筆記 Ⅰ】5 參數和超參數

在深度學習中&#xff0c;參數&#xff08;Parameters&#xff09; 和 超參數&#xff08;Hyperparameters&#xff09; 是模型訓練中兩個核心概念&#xff0c;它們共同決定了模型的性能&#xff0c;但作用方式和優化方法截然不同。以下是詳細對比與解析&#xff1a;1. 參數&am…

Linux 阻塞等待框架

在 Linux 設備驅動開發中&#xff0c;阻塞機制 是處理資源暫時不可用&#xff08;如設備未準備好數據、緩沖區滿等&#xff09;的核心手段。驅動程序可以將被阻塞的進程設置成休眠狀態&#xff0c;然后&#xff0c;在資源可用后&#xff0c;再將該進程喚醒。 在 Linux 驅動開發…

PCIe RAS學習專題(3):AER內核處理流程梳理

目錄 一、AER內核處理整體流程梳理 二、AER代碼重要部分梳理 1、AER初始化階段 2、中斷上半部 aer_irq 3、中斷下半部 aer_isr 3.1、aer_isr_one_error 3.2、find_source_device 3.3、aer_process_err_devices 3.4、handle_error_source 3.5、pcie_do_recovery 整體邏…

?HAProxy負載均衡集群概述

前言&#xff1a; 在現代分布式系統中&#xff0c;負載均衡和高可用性是保障服務穩定性和性能的關鍵技術。HAProxy 作為一款高性能的 TCP/HTTP 負載均衡器&#xff0c;憑借其輕量級、高并發處理能力和靈活的配置機制&#xff0c;成為構建高可用架構的核心組件之一。通過智能的流…

ELN:生物醫藥科研的數字化引擎——衍因科技引領高效創新

在生物醫藥研究領域&#xff0c;實驗數據的準確記錄與管理是科研成敗的關鍵。想象一個場景&#xff1a;某頂尖醫學院實驗室&#xff0c;研究員小張正為一項抗癌藥物實驗焦頭爛額。紙質記錄本中&#xff0c;數據混亂、協作困難&#xff0c;導致實驗重復率高達20%。引入衍因科技的…

暑假---作業2

學習目標&#xff1a;xss-1abs 1-8關python美現自動化布爾自注的2、代碼進行優化(二分查找)學習內容&#xff1a;1.xss-1abs 1-8關1<h2 align"center">歡迎用戶test</h2>2 <script> alert (1)</script&gt<center> <form action&…

【Tensor數據轉換】——深度學習.Torch框架

目錄 1 Tensor與Numpy 1.1 張量轉Numpy 1.2 Numpy轉張量 1 Tensor與Numpy 1.1 張量轉Numpy 調用numpy()方法可以把Tensor轉換為Numpy&#xff0c;此時內存是共享的。 使用copy()方法可以避免內存共享 import torch import numpy as np# tensor轉numpy:numpy() def test0…

基于Tranformer的NLP實戰(5):BERT實戰-基于Pytorch Lightning的文本分類模型

文本分類作為自然語言處理中的基礎任務&#xff0c;能夠幫助我們將海量醫學摘要自動歸類到具體疾病領域中。本文將基于NVIDIA NeMo框架&#xff0c;構建一個用于醫學疾病摘要分類的深度學習應用&#xff0c;支持將摘要劃分為三類&#xff1a;癌癥類疾病、神經系統疾病及障礙、以…

14-鏈路聚合

鏈路聚合技術 一 鏈路聚合概述鏈路聚合定義鏈路聚合是把多條物理鏈路聚合在一起&#xff0c;形成一條邏輯鏈路。應用在交換機、路由器、服務器間鏈路。分為三層鏈路聚合和二層鏈路聚合。二 鏈路聚合的作用 1. 鏈路聚合模式靜態聚合模式 端口不與對端設備交互信息。選擇參考端口…

學習C++、QT---28(QT庫中使用QShortcut類對快捷鍵創建和使用的講解)

每日一言 所有的努力&#xff0c;都是為了讓未來的自己感謝現在的你。 QShortcut 我們的記事本肯定要有通過快捷鍵對字體的放大和縮小進行控制的功能啊&#xff0c;那么我們這邊就這個問題我們需要先學習一下QShortCut 我們這個類就是專門做快捷鍵的 老樣子我們剛開始學習這個…

Web Worker:讓前端飛起來的隱形引擎

目錄 Web Worker&#xff1a;讓前端飛起來的隱形引擎 一、什么是 Web Worker&#xff1f; 1、為什么需要 web worker 2、什么是 web worker 二、基本使用方法 1、創建一個 Worker 文件&#xff08;worker.js&#xff09; 2、主線程引入并使用 三、實戰案例&#xff1a;…

關于在VScode中使用git的一些步驟常用命令及其常見問題:

輸入 gitee用戶 gitee綁定郵箱git config --global user.name "automated-piggy-senior" git config --global user.email "1323280131qq.com"克隆遠程庫到本地 git clone https://gitee.com/automated-piggy-senior/20250717-test.git常見問題1&#xff1…

LeafletJS 性能優化:處理大數據量地圖

引言 LeafletJS 作為一個輕量、靈活的 JavaScript 地圖庫&#xff0c;以其高效的渲染能力和模塊化設計深受開發者喜愛。然而&#xff0c;當處理大數據量&#xff08;如數千個標記、復雜的 GeoJSON 數據或高分辨率瓦片&#xff09;時&#xff0c;LeafletJS 的性能可能面臨挑戰&…

LLM(Large Language Model)大規模語言模型淺析

參考: https://zhuanlan.zhihu.com/p/7046080918 LLM(Large Language Model)大規模語言模型,是指具有大規模參數和復雜計算結構的機器學習模型。大模型里常說的多少B, B 是 Billion 的縮寫&#xff0c;表示 十億,如DeepSeek滿血版 671B(6710億參數); 大模型本質上是一個使用海量…

【后端】配置SqlSugar ORM框架并添加倉儲

目錄 1.添加包 2.配置連接字符串 3.配置SqlSugar 3.1.添加基礎類 3.2.添加方法 3.2.1.讀取配置方法 3.2.2.枚舉擴展方法 3.3.添加管理類&#xff08;重要&#xff09; 4.配置倉儲 4.1.倉儲接口添加 5.注冊 6.使用 該文檔是配置SqlSugar多租戶和加倉儲教程。使用 S…

全國高等院校計算機基礎教育研究會2025學術年會在西寧成功舉辦 ——高原論道啟新程,數智融合育英才

7 月16日至18日&#xff0c;全國高等院校計算機基礎教育研究會2025學術年會在青海西寧隆重召開。大會以“數智融合&#xff0c;創新計算機教育”為主題&#xff0c;匯聚人工智能領域頂尖專家學者、高校校長、產業翹楚及一線教師300 多人&#xff0c;共商人工智能時代計算機基礎…

AppTrace:重新定義免填邀請碼,解鎖用戶裂變新高度

??在移動互聯網時代&#xff0c;?用戶裂變是App增長的核心引擎&#xff0c;而邀請機制則是裂變的關鍵驅動力。然而&#xff0c;傳統的邀請碼機制——依賴用戶手動輸入、記憶復雜字符——已經成為用戶體驗的絆腳石&#xff0c;導致轉化率下降、運營成本上升。?AppTrace? 作…

神經網絡常見激活函數 13-Softplus函數

文章目錄Softplus函數導函數函數和導函數圖像優缺點PyTorch 中的 Softplus 函數TensorFlow 中的 Softplus 函數Softplus 函數導函數 Softplus函數 Softplus?(x)ln?(1ex)\begin{aligned} \operatorname{Softplus}(x) & \ln \bigl(1 e^{\,x}\bigr) \end{aligned} Softplu…

深度理解 KVM:Linux 內核系統學習的重要角度

&#x1f4d6; 推薦閱讀&#xff1a;《Yocto項目實戰教程:高效定制嵌入式Linux系統》 &#x1f3a5; 更多學習視頻請關注 B 站&#xff1a;嵌入式Jerry 深度理解 KVM&#xff1a;Linux 內核系統學習的重要角度 作者&#xff1a;嵌入式 Jerry 一、為什么開發者需要學習 KVM&…