家族: 心の小居 - 十二翼炽天使
きみのそらはなにいろですか? ... ... - 帖子
- 5536
- 精华
- 0
- 积分
- 16634
- 雪の涙
- 973
- 雪の露
- 12378
- 雪の晶
- 0
- 雪の過
- 0
- 在线时间
- 8612 小时
- 注册时间
- 2007-12-22
- 最后登录
- 2024-11-21
|
13楼
大 中
小 发表于 2010-02-24 01:53 只看该作者
引用:#include<stdio.h>
struct bmp
{
int dibid;
long filesize;
long re;
long offset;
long header;
long width;
long heigth;
int planes;
int bpp;
long com;
long datasize;
long hre;
long vre;
long colors;
long icolors;
};
int chkdata(char *p1,char *p2,int size)
{
while(size)
{
if(*p1!=*p2)return 0;
p1++;p2++;size--;
};
return 1;
};
main()
{
char *p1,*p2;
int y1=0,y2;
FILE *f1,*f2,*f3;
struct bmp bmphead[2];
/*初始化,打开文件,申请内存,写文件头*/
f1=fopen("g:\\windows\\desktop\\1.bmp","rb");
f2=fopen("g:\\windows\\desktop\\2.bmp","rb");
f3=fopen("g:\\windows\\desktop\\6.bmp","wb");
fread(&bmphead[0],54,1,f2);
fread(&bmphead[1],54,1,f1);
fwrite(&bmphead[0],54,1,f3);
p1=(char *)malloc(bmphead[0].width*3);
p2=(char *)malloc(bmphead[0].width*3);
/*下部文件直接拷贝*/
for(y2=0;y2<bmphead[0].heigth;y2++)
{
fread(p1,bmphead[0].width*3,1,f2);
fwrite(p1,bmphead[0].width*3,1,f3);
};
/*上部文件处理*/
while(!chkdata(p1,p2,bmphead[1].width*3))
{
fread(p2,bmphead[1].width*3,1,f1);
if(feof(f1))break;
y1++;
};
bmphead[0].heigth+=bmphead[1].heigth-y1;/*计算出f3的高度*/
for(;y1<bmphead[1].heigth;y1++)
{
fread(p1,bmphead[1].width*3,1,f1);
fwrite(p1,bmphead[1].width*3,1,f3);
};
/*重写文件头及关闭文件*/
rewind(f3);
fwrite(&bmphead[0],54,1,f3);
fclose(f1);fclose(f2);fclose(f3);
} 看了下日期,是2006/2/5,當時應該是學C語言不久(其實偶C語言學的時間不是很長),就表扔磚頭了.
嘛,偶解釋一下程序流程吧.
首先,這是專門針對"24位色的BMP無損無壓縮圖像"用的.
作用在於,對一幅超過屏幕分辨率大小的CG分別進行上下截圖,再用此程序合成.
BMP的圖像數據是自下而上,從左到右的.
所以首先載入的是下部的圖片,再載入上部圖片.
把下部的圖片載入完成後,再用下部圖片的最後一條線做為識別.
以640x480圖像,換成坐標來說,就是下部圖片的 (0,0)至(0,639) 這一條線做為識別,
再找出上部圖片的同一條線,進行合並處理.
看起來似乎很容易會判斷錯誤,但其實不會的.
因為遊戲CG的精度很高,除非是弄到矢量數據,否則真的很難找出第2條一模一樣的線.
說回跟本主題的關係.
偶看樓主那幾幅圖,似乎也可以用類似的算法.
以小圖的某一條線,作為引導,搜索出大圖同一條線位置,再推算出坐標.
再複雜一點,可以用高是2-3像素的"面"為標識,搜索出大圖同一位置,再推算出坐標.
超級無敵美工渣.
|