FreeImage库在C++与C#中的简单使用

来源:互联网 发布:淘宝的商家编码是什么 编辑:程序博客网 时间:2024/05/17 18:17

FreeImage库在C++与C#中的简单使用


1.在C++中读图,合并图片

  分别将FreeImage库解压包中的“.h”,".lib",".dll"文件加入编译器vc的“include”,"lib","bin"文件夹中,在新建的C++文件中申明头文件“FreeImage.h”并包含FreeImage的lib库(#pragma comment(lib,"FreeImage.lib")),这之后便可以在VC中使用FreeImage库了。
  
#include<stdio.h>#include<FreeImage.h> #include<iostream>#include<math.h>#pragma comment(lib,"FreeImage.lib")using namespace std;

int main(int argc,char* argv){ char* imageFile="church01.jpg";//初始化FreeImage_Initialise(TRUE);//读取图像FIBITMAP * bitmap=FreeImage_Load(FIF_JPEG,imageFile,JPEG_DEFAULT);if(bitmap) cout<<"Image Load successful!"<<endl;//得到图像相关信息FREE_IMAGE_TYPE img_type=FreeImage_GetImageType(bitmap);int width=FreeImage_GetWidth(bitmap);int height=FreeImage_GetHeight(bitmap);int bytespp = FreeImage_GetLine(bitmap)/ width; //单位宽度所含字节数int pitch=FreeImage_GetPitch(bitmap); //行扫描宽度int ByteWidth = FreeImage_GetLine(bitmap);int bpp=FreeImage_GetBPP(bitmap);//图像位深cout<<"Image Type: "<<img_type<<endl;cout<<"Height: "<<height<<"  Width: "<<width<<endl;cout<<"bytespp:"<<bytespp<<endl;cout<<"Pitch:" <<pitch<<endl<<"ByteWidth: "<<ByteWidth<<endl;cout<<"bpp:"<<bpp<<endl;

<span style="white-space:pre"></span>//Copy3张图片做,获取3张图片数据首位指针//指针数组的声明FIBITMAP **src=NULL;BYTE * bits[3]={};src=new FIBITMAP *[3];for(int i=0;i<3;i++){src[i]=FreeImage_Copy(bitmap,0,0,width,height); bits[i]=(BYTE*) FreeImage_GetBits(src[i]);}//分配输出图片空间,获取输出图片数据首位指针FIBITMAP * dst=FreeImage_Allocate(3*width,3*height,bpp);    <span style="white-space:pre"></span>BYTE * bits_dst=FreeImage_GetBits(dst);

//数据变化for(int h=0;h<3;h++){for(int i=0;i<height;i++)//在遍历高度的同时设置输入及每一行中每张图片的数据首位指针{BYTE * pixel_dst1=bits_dst;BYTE * pixel_dst2=bits_dst+3*FreeImage_GetWidth(bitmap);BYTE * pixel_dst3=bits_dst+2*3*FreeImage_GetWidth(bitmap); BYTE * pixel_src =bits[h];for(int j=0;j<width;j++){pixel_dst1[FI_RGBA_RED]=pixel_src[FI_RGBA_RED];pixel_dst1[FI_RGBA_GREEN]=pixel_src[FI_RGBA_GREEN];pixel_dst1[FI_RGBA_BLUE]=pixel_src[FI_RGBA_BLUE];pixel_dst2[FI_RGBA_RED]=pixel_src[FI_RGBA_RED];pixel_dst2[FI_RGBA_GREEN]=pixel_src[FI_RGBA_GREEN];pixel_dst2[FI_RGBA_BLUE]=pixel_src[FI_RGBA_BLUE];pixel_dst3[FI_RGBA_RED]=pixel_src[FI_RGBA_RED];pixel_dst3[FI_RGBA_GREEN]=pixel_src[FI_RGBA_GREEN];pixel_dst3[FI_RGBA_BLUE]=pixel_src[FI_RGBA_BLUE];pixel_dst1+=3;pixel_dst2+=3;pixel_dst3+=3;pixel_src+=3; }//指针换行设置bits_dst+=3*pitch;bits[h]+=pitch;}}

</pre><pre name="code" class="cpp">//保存图像FreeImage_Save(FIF_PNG,dst,"church01_dst.jpg",0);//释放图像空间delete[] src;if(bitmap)  FreeImage_Unload(bitmap);getchar();}

9合1效果图:
  


此处9合1操作代码很丑,效率不高,不能直视,使用起来也有限制性(图片位深需为24位),读入图片类型可通过FreeImage函数参数修改,未严格考虑内存配置和释放问题(还在努力学习中),以后有时间再做修改。


2.在C#中的简单使用

  相关的配置工作参见Rana博文点击打开链接,在此只写出贴出9合1转换的核心代码:

                int copycount = Width * Height * 4;                   IntPtr Bits = FreeImage_GetBits(Dib);                byte[] line = new byte[Width * Height * 4];                System.Runtime.InteropServices.Marshal.Copy(Bits, line, 0, copycount);                byte[][] btList = { new byte[]{}, new byte[]{}, new byte[]{},                                  new byte[]{},new byte[]{},new byte[]{},                                  new byte[]{},new byte[]{},new byte[]{}};                for (int i = 0; i < 9; i++)                {                    btList[i] = line;                }                byte[] camfusion = new byte[Height * Width * 4 * 9];                for (int i = 0; i < height1; i++)                {                    //Buffer.BlockCopy(btList[0],i*width*4,camfusion,3*i*width*4,width*4);                    Buffer.BlockCopy(btList[0], i * width1 * 4, camfusion, 3 * i * width1 * 4, width1 * 4);                    Buffer.BlockCopy(btList[1], i * width1 * 4, camfusion, 3 * i * width1 * 4 + width1 * 4, width1 * 4);                    Buffer.BlockCopy(btList[2], i * width1 * 4, camfusion, 3 * i * width1 * 4 + 2 * width1 * 4, width1 * 4);                    Buffer.BlockCopy(btList[3], i * width1 * 4, camfusion, width1 * height1 * 3 * 4 + 3 * i * width1 * 4, width1 * 4);                    Buffer.BlockCopy(btList[4], i * width1 * 4, camfusion, width1 * height1 * 3 * 4 + 3 * i * width1 * 4 + width1 * 4, width1 * 4);                    Buffer.BlockCopy(btList[5], i * width1 * 4, camfusion, width1 * height1 * 3 * 4 + 3 * i * width1 * 4 + 2 * width1 * 4, width1 * 4);                    Buffer.BlockCopy(btList[6], i * width1 * 4, camfusion, width1 * height1 * 3 * 4 * 2 + 3 * i * width1 * 4, width1 * 4);                    Buffer.BlockCopy(btList[7], i * width1 * 4, camfusion, width1 * height1 * 3 * 4 * 2 + 3 * i * width1 * 4 + width1 * 4, width1 * 4);                    Buffer.BlockCopy(btList[8], i * width1 * 4, camfusion, width1 * height1 * 3 * 4 * 2 + 3 * i * width1 * 4 + 2 * width1 * 4, width1 * 4);                } 








0 0
原创粉丝点击