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
- FreeImage库在C++与C#中的简单使用
- FreeImage使用中的小插曲
- FreeImage图形库如何在Linux下的使用
- 在OpenGL中使用FreeImage库生成纹理
- FreeImage图形库如何在Linux下的使用
- 使得freeimage 能在mingw 下使用
- 使得freeimage 能在mingw 下使用
- IEnumerable与IEnumerator在C#中的使用
- IEnumerable与IEnumerator在C#中的使用
- IEnumerable与IEnumerator在C#中的使用
- IEnumerable与IEnumerator在C#中的使用
- IEnumerable与IEnumerator在C#中的使用
- 指针在C与Delphi中的使用
- 在VC中用FreeImage显示图片的简单方法
- 用FreeImage在图片中添加简单注释
- 使用FreeImage静态库的初始化
- 使用Freeimage库时报错的解决方法
- 线程调试,关于《FreeImage使用中的小插曲》!
- 数据结构第三次实验
- Web前端调试工具——神奇的Console
- ubuntu 删除mysql
- jQuery Mobile在微信建站方面的应用
- Intersection of Two Linked Lists leetcode
- FreeImage库在C++与C#中的简单使用
- iOS复习笔记1:HelloWorld项目
- Linux搭建SVN服务器极简备忘
- 高质量icon图标
- [C++]LeetCode: 60 Intersection of Two Linked Lists
- 【Spark亚太研究院系列丛书】Spark实战高手之路-第3章Spark架构设计与编程模型第1节:为什么Spark是大数据必然的现在和未来?(2)
- HDU1863 畅通工程 最小生成树
- Hibernate执行流程简介
- 第七章 查找技术 思维导图