打印

[求助] ev合成,英雄×魔王

引用:
原帖由 haibara 于 2010-02-22 22:52 发表
我觉得这个例子不好

原因在于必须动用photoshop,firework,也就是说要手动定位坐标

根据我的汇总来看,离现在最近的比较合适学习的例子是夢喰い-つるみく式ゲーム製作-
說起來,偶好像5年前用C語言寫過一個合成程序.
當時是因為,自截某遊戲的CG過大,所以分別對上,下截圖,再用此程序合成.
應該可以作為參考來做坐標自動定位的程序的.如果 haibara 有興趣的話,偶也可以把源碼發出來的.

另外,樓上的也不要太露骨了.
超級無敵美工渣.
引用:
#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像素的"面"為標識,搜索出大圖同一位置,再推算出坐標.
超級無敵美工渣.
引用:
原帖由 haibara 于 2010-02-24 07:30 发表
我怎么觉得不对,应该说差分图边缘(线)不可能与基本图一样的,应该说像素比较接近(按照面搜索,估计与photoshop的photomerge差不多,非常不稳定,而且只能效果更差吧)

ps:有可能我想当然了,不过既然没有这样 ...
嘛,因為偶幾個月前也寫過個差分摳圖工具,
所以偶還是相信這種算法是可行的.

不過這樣討論下去也不會有進展.
要不這樣吧,樓上提供主樓那個<英雄x魔王>的無損素材,上面2張圖就足夠了(注意,是無損,一切算法都是建立在無損的基礎上的).
然後偶試試把程序做出來.不過,最近系統重灌,而且事情不少,時間很難說得下來.

當然,如果偶程序真的做出來的,請 haibara 給偶做一件很簡單的事情.
超級無敵美工渣.
haibara都叫偶安了,那偶就安心在肚子裡多養幾只懶蟲算了.LS辛苦了.
超級無敵美工渣.
貌似改了很多次.
偶只看見 17:35 那次,和現在 00:06 的一次.

偶暫時不是很想學JAVA,只想知道成功了米有?
超級無敵美工渣.
引用:
原帖由 haibara 于 2010-02-28 02:27 发表


改了3次吧,第1次其实就对了,不过不好看,改了后边界问题,然后再改,又忘记像素X3字节。。。

我测试了1个,可以
可以了就好,偶當年的設想居然也能老蚌生珠了.

那樣的話,偶再說一點注意的地方好了.
引用:
以小圖的某一條線,作為引導,搜索出大圖同一條線位置,再推算出坐標.
偶這一句其實也是有點隱語的.
線固然是線,但不一定要是最邊的一條線.所以,後面才說是"推算".
超級無敵美工渣.
八仙過海,各顯神通.
米有做不出來的程序,只有想不到的程序.祝haibara在合成之路上武運昌隆吧.
話說,那個alpha的,以前寫的摳圖程序,用來摳遊戲裡人物的.因為人物邊緣被模糊化了,所以也做成可以按一定程度模糊摳圖的.
超級無敵美工渣.
查看积分策略说明

快速回复主题

选项

[完成后可按 Ctrl+Enter 发布]  预览帖子  恢复数据  清空内容

当前时区 GMT+8, 现在时间是 2024-05-11 19:56

Processed in 0.015633 second(s), 6 queries.