1. 程式人生 > >圖片處理(一)之BMP格式24bit轉16bit

圖片處理(一)之BMP格式24bit轉16bit

功能: 通過C程式實現圖片處理,把24bit_BMP轉為16bit_BMP

主要流程:

1)開啟圖片檔案,獲得檔案流指標

2)讀取開頭54byte,獲取圖片頭部結構體,分析圖片資訊

3)再獲取圖片的資料部分(頭部結構體之後的部分)

4)通過位偏移,把每3byte的(888RGB)轉為2byte(1555GRB)

5)把所有資料寫到另一個空的BMP檔案

#include <stdio.h>

#include <stdlib.h>
#include <string.h>


#define BMP_TYPE 0x424D
#define BI_RGB               0
#define BMP1555_BYTE    2
#define BMP24_BYTE  3
#define BMP32_BYTE 4


#define CURBMP_BYTE          BMP24_BYTE


#define BMP24_TO_16(B, G, R)   ((B << 0)|(G << 5)|(R << 10))


typedef unsigned short WORD;
typedef unsigned int  DWORD;
typedef unsigned long  LONG;


#pragma pack(1)
typedef struct tagBITMAPFILEHEADER 
{     
WORD    bfType;     
DWORD   bfSize;     
WORD    bfReserved1;     
WORD    bfReserved2;     
DWORD   bfOffBits; 
} BITMAPFILEHEADER;


#pragma pack(1)
typedef struct tagBITMAPINFOHEADER

        DWORD  biSize;     
LONG   biWidth;     
LONG   biHeight;     
WORD   biPlanes;     
WORD   biBitCount;     
DWORD  biCompression;     
DWORD  biSizeImage;     
LONG   biXPelsPerMeter;     
LONG   biYPelsPerMeter;     
DWORD  biClrUsed;     
DWORD  biClrImportant; 
} BITMAPINFOHEADER; 


int main(int argc,char** argv)
{
int nErrorCode=0;
FILE *fin;
FILE *fout;
char szInFilename[256];
char szOutFilename[256];
if(argc==3)
{
strcpy(szInFilename ,argv[1]);
strcpy(szOutFilename,argv[2]);
}
else
{
strcpy(szInFilename , "333.bmp");
strcpy(szOutFilename, "444.bmp");
}

printf("src:%s, dest:%s\n",szInFilename,szOutFilename);
fin  = fopen(szInFilename , "rb");
fout = fopen(szOutFilename, "wb");

if(fin && fout)
{
//get BufHeader   
    BITMAPFILEHEADER BmpBufHeader;                         
   if(fread(&BmpBufHeader, 1, sizeof(BITMAPFILEHEADER), fin))
  {                           
    printf("Type:  0x%x\n",BmpBufHeader.bfType);
   printf("Size:  0x%x\n",BmpBufHeader.bfSize);
    printf("Offset:%d\n"  ,BmpBufHeader.bfOffBits);  
}
else
nErrorCode |= 0x2;

//get InfoHeader  
    BITMAPINFOHEADER BmpInfoHeader;
    if(fread(&BmpInfoHeader, sizeof(BITMAPINFOHEADER), 1, fin))
    {
    printf("biWidth :   %d\n",BmpInfoHeader.biWidth); 
    printf("biHeight:   %d\n",BmpInfoHeader.biHeight);
    printf("biBitCount: %d\n",BmpInfoHeader.biBitCount);
}
else
nErrorCode |= 0x4;


//handle Header
    int BmpDataNum;  
    if(BmpInfoHeader.biBitCount != BMP24_BYTE*8 && BmpBufHeader.bfType != BMP_TYPE && BmpInfoHeader.biCompression != BI_RGB)
    {
    nErrorCode |= 0x8;  
   }
    BmpInfoHeader.biBitCount  = BMP1555_BYTE * 8;
    BmpDataNum = (BmpBufHeader.bfSize - BmpBufHeader.bfOffBits) / CURBMP_BYTE;
    BmpBufHeader.bfSize = BmpDataNum * BMP1555_BYTE * 8 + BmpBufHeader.bfOffBits; 
    BmpInfoHeader.biSizeImage = (BmpInfoHeader.biSizeImage * BMP1555_BYTE) / CURBMP_BYTE;
    
    //get BmpData
   fseek(fin, 54, SEEK_SET);
    unsigned char  *BmpDatabuff    = malloc(CURBMP_BYTE   * BmpDataNum);
    unsigned short *BmpDatabuffNew = malloc(BMP1555_BYTE * BmpDataNum);
    if(!fread (BmpDatabuff, 1, CURBMP_BYTE * BmpDataNum, fin))
    nErrorCode |= 0x10;
    memset(BmpDatabuffNew, 0, BMP1555_BYTE * BmpDataNum );
    
   //handle BmpData(important)
   int i;
   unsigned int B,G,R;
    for(i = 0; i < BmpDataNum; i++)
   {        
        B = (BmpDatabuff[i*CURBMP_BYTE+0] >> 3)&0x1F;//blue
        G = (BmpDatabuff[i*CURBMP_BYTE+1] >> 3)&0x1F;//green
        R = (BmpDatabuff[i*CURBMP_BYTE+2] >> 3)&0x1F;//red
        BmpDatabuffNew[i] = (unsigned short)BMP24_TO_16(B, G, R);
   }      
    
//creat NewBmp
    fseek(fout, 0, SEEK_SET);
    if(!fwrite(&BmpBufHeader , 1, sizeof(BITMAPFILEHEADER), fout))
   {
    nErrorCode |= 0x20;
    }
   if(!fwrite(&BmpInfoHeader, 1, sizeof(BITMAPINFOHEADER), fout))
    {
    nErrorCode |= 0x40;
    }    
    fseek(fout, 54, SEEK_SET);
    if(!fwrite(BmpDatabuffNew, BMP1555_BYTE, BmpDataNum, fout))
    {
    nErrorCode |= 0x80;
    }                     
   
}
else
{
nErrorCode |= 0x1;
}


if(fin)
{
fclose(fin);
}
if(fout)
{
fclose(fout);
}
printf("nErrorCode: %d\n", nErrorCode);
printf("BMP32_TO_16:%s\n",!nErrorCode?"success":"fail");
system("pause");
return nErrorCode;
}

相關推薦

圖片處理BMP格式24bit16bit

功能: 通過C程式實現圖片處理,把24bit_BMP轉為16bit_BMP 主要流程: 1)開啟圖片檔案,獲得檔案流指標 2)讀取開頭54byte,獲取圖片頭部結構體,分析圖片資訊 3)再獲取圖片的資料部分(頭部結構體之後的部分) 4)通過位偏移,把每3byte的(888R

圖片處理

圖片的處理大概分 截圖(capture),  縮放(scale), 設定大小(resize),  儲存(save) 1.等比率縮放 - (UIImage *)scaleImage:(UIImage *)image toScale:(float)scaleSize {

python自然語言處理中文分詞預處理、統計詞頻

一個小的嘗試。。資料來源資料集 一共200條關於手機的中文評論,以XML格式儲存。分詞工具 python-jieba預處理包括去停用詞、去標點符號和數字去停用詞:使用的是他人總結的 停用詞表去標點符號和數字:用正則表示式。原本打算的是中文標點符號從網上覆制,英文標點符號用st

iOS圖片處理呼叫系統相機和相簿獲取圖片,給相機新增自定義覆蓋物

[摘要:起首,拍照或從相簿挑選照片須要應用 UIImagePickerController,應用時須要增加兩個協定 #import UIKit/UIKit.h @interface ViewContr

【opencv入門七】形態學圖像處理:膨脹、腐蝕

tar struct show 函數 使用 運算 腐蝕和膨脹 依賴 版本 參考網站: http://blog.csdn.net/poem_qianmo/article/details/23710721 1、形態學(morphology)概述   數學形態學(Mathem

Linux內核設計基礎中斷處理

family ng- 內存 irq strong 睡眠 sign 技術 struct 假設讓內核定期對設備進行輪詢。以便處理設備,那會做非常多無用功,假設能讓設備在

Python+OpenCV圖像處理——讀取顯示圖片

沒有 class 釋放資源 圖像 Coding 路徑 troy 如果 nco   配置好所有環境後,開始利用python+opencv進行圖像處理第一步。   讀取和顯示一張圖片: import cv2 as cv src=cv.imread(‘E:\imageload\

elas演算法原始碼賞析:PGM格式圖片的讀取和儲存

image.h原始碼 來說說標頭檔案 pgm格式 簡約筆記 // basic image I/O, based on Pedro Felzenszwalb's code #ifndef IMAGE_H #define

opencv影象處理:讀取圖片,裁剪圖片

1.利用opencv讀取圖片: # -*- coding: utf-8 -*- # !/usr/bin/env python # @Time : 2018/11/19 14:59 # @Author : xhh # @Desc : 讀取圖片 # @File : open

python3+opencv3 影象處理讀取顯示圖片

  先在此處先宣告,後面學習python+opencv影象處理時均參考這位博主的博文https://blog.csdn.net/u011321546/article/category/7495016/2?,我只是復現和稍微修改一下程式碼,加深自己印象的同時也督促自己好好學習影

影象處理特徵提取HOG特徵 特徵數的計算

對於64128的影象而言,每88的畫素組成一個cell,每22個cell組成一個塊,也就是說,64128的圖片,總共有36715=3780個特徵。 單個cell的9個特徵,每個block(掃描視窗)包含22個cell也就是229=36個特徵,一個64128大小的

【NIFI】 Apache NiFI ExecuteScript處理 【NIFI】 Apache NiFI ExecuteScript處理

  本例介紹NiFI ExecuteScript處理器的使用,使用的指令碼引擎ECMScript   接上一篇【NIFI】 Apache NiFI 之 ExecuteScript處理(一) ExecuteScript使用   1、動態屬性     其中一個功能是動態屬性的概念,也稱為使用者定義屬性。這

SpringMVC_9_ 處理模型資料ModelAndView、Map、@SessionAttributes

SpringMVC提供了以下幾種途徑輸出模型資料: ModelAndView:處理方法返回值型別為ModelAndView時,方法體即可通過該物件新增模型資料 Map 及 Model:入參為org.springframework.ui.Model、org.springfra

影象處理特徵提取HOG特徵簡單梳理

  上圖是一張行人圖的四種表示方式,原三色圖,灰度圖,邊緣圖,梯度圖,人腦根據前期學習與先驗知識很容易理解到影象中包含著一個行人,並可以根據一定情況將其從影象中摳選出來,但計算機是怎麼思考的呢?怎樣讓計算機理解以上影象中包含的是一個行人呢?前三個影象現在情況不適用,所以選取梯度圖,現在的梯度圖同樣也是人腦處理

python進階—OpenCV影象處理

文章目錄 顏色空間轉換 RGB色彩空間 HSV色彩空間 YUV色彩空間 簡單的物體跟蹤示例 HSV空間目標閾值選取 影象幾何變換 影象的縮放 影象的位移 影象的旋轉 影

多因子模型因子訊號測試平臺----因子值的處理

在前面一節,我們成功計算出來了因子值。 在開始今天的內容前,我們要先了解幾個概念。許多書本上,可能不會這樣講,這個僅僅是筆者的一些感悟。 0.幾種factor         先來弄清楚筆者自己總結的

影象處理其他雜項MeanShift的目標跟蹤演算法opencv c++程式碼 VS2015+opencv3.2

//#include "stdafx.h" //#include "cv.h" //#include "highgui.h" #include<opencv.hpp> #define u_char unsigned char #define DIST 0.5 #define

Tensorflow常見問題處理 TensorFlow 影象預處理 影象編解碼,影象尺寸調整 tensorflow():圖片處理 TensorFlow 處理圖片

1、Tensorflow中影象處理函式(影象大小調整)   Tensorflow中影象處理函式(影象大小調整)   tensorflow入門之---------影象大小調整   TensorFlow 影象預處理(一) 影象編解碼,影象尺寸調整   Tensorflow針對不定尺寸的圖片讀寫tfreco

Spring mvc請求處理流程詳解檢視解析

前言   Spring mvc框架相信很多人都很熟悉了,關於這方面的資料也是一搜一大把。但是感覺講的都不是很細緻,讓很多初學者都雲裡霧裡的。本人也是這樣,之前研究過,但是後面一段時間不用發現又忘記了。所以決定寫下來,以備後用。   本系列文基於spring-

前端奇淫技巧前端遇到需要資料遍歷的如何處理

前端經常會遇到需要資料遍歷的盒子,即內容結構相同的Html程式碼,很多小夥伴都是直接copy,但是很容易出現最後因為複製貼上的問題,而且如果需要修改,就要把全部刪掉,重新複製一遍,很麻煩,所以為了解決