专注收集记录技术开发学习笔记、技术难点、解决方案
网站信息搜索 >> 请输入关键词:
您当前的位置: 首页 > C++ Builder

怎么编程显示一个图片和图片的倒影呢?谢谢

发布时间:2011-06-28 13:43:27 文章来源:www.iduyao.cn 采编人员:星星草
如何编程显示一个图片和图片的倒影呢?多谢
如何编程显示一个图片和图片的倒影呢?多谢

------解决方案--------------------
越说越邪乎了,GDI很简单的代码就可以实现的效果,没有必要搞那么复杂。话不多说,直接上代码,运行的效果是最好的检验。

C/C++ code
void __fastcall TForm1::Button1Click(TObject *Sender)
{
    // 创建两个位图对象
    Graphics::TBitmap *bmpSrc = new Graphics::TBitmap;
    Graphics::TBitmap *bmpDst = new Graphics::TBitmap;

    try
    {
        // 从文件中装载位图
        bmpSrc->LoadFromFile("C:\\ccrun\\222.bmp");

        // 位图的高和宽
        int nWidth = bmpSrc->Width;
        int nHeight = bmpSrc->Height;

        // 源图的边框区域和目标图的边框区域
        TRect rctSrc(0, 0, nWidth, nHeight);
        TRect rctDst(0, nHeight - 1, nWidth, -1);
        // 如果要水平翻转,就将rctDst定义成如下
        // TRect rctDst(nWidth - 1, 0, -1, nHeight);

        // 目标图的宽和高和源图一致
        bmpDst->Width = nWidth;
        bmpDst->Height = nHeight;

        // 垂直翻转
        bmpDst->Canvas->CopyRect(rctDst, bmpSrc->Canvas, rctSrc);

        // 将源图绘制在窗体左上方
        Canvas->Draw(0, 0, bmpSrc);
        // 接着在源图下方绘制出目标图,造成倒影的感觉
        Canvas->Draw(0, nHeight, bmpDst);

        // 如果是水平翻转,就在源图的右侧绘制出目标图
        // Canvas->Draw(nWidth, 0, bmpDst);
    }
    __finally
    {
        // 清场
        delete bmpSrc;
        delete bmpDst;
    }
}

------解决方案--------------------
趁妖哥不在骗点分,改进版倒影:
C/C++ code
void __fastcall TForm1::Button1Click(TObject *Sender)
{
    // 创建两个位图对象
    Graphics::TBitmap *bmpSrc = new Graphics::TBitmap;
    Graphics::TBitmap *bmpDst = new Graphics::TBitmap;

    try
    {
        // 从文件中装载位图
        bmpSrc->LoadFromFile("C:\\ccrun\\222.bmp");

        // 位图的高和宽
        int nWidth = bmpSrc->Width;
        int nHeight = bmpSrc->Height;

        // 源图的边框区域和目标图的边框区域
        TRect rctSrc(0, 0, nWidth, nHeight);
        TRect rctDst(0, nHeight - 1, nWidth, -1);
        // 如果要水平翻转,就将rctDst定义成如下
        // TRect rctDst(nWidth - 1, 0, -1, nHeight);

        // 目标图的宽和高和源图一致
        bmpDst->Width = nWidth;
        bmpDst->Height = nHeight;

        // 垂直翻转
        bmpDst->Canvas->CopyRect(rctDst, bmpSrc->Canvas, rctSrc);
        bmpDst->PixelFormat = pf32bit;
        // 渐变透明度
        for(int y=0; y<nHeight; y++)
        {
            RGBQUAD* cr = (RGBQUAD*)bmpDst->ScanLine[y];
            double alpha = 255.0 - 255.0*y/nHeight;
            for(int x=0; x<nWidth; x++)
            {
                cr[x].rgbReserved = alpha+0.5;
                cr[x].rgbBlue *= alpha/255.0;
                cr[x].rgbRed *= alpha/255.0;
                cr[x].rgbGreen *= alpha/255.0;
            }
        }

        // 将源图绘制在窗体左上方
        Canvas->Draw(0, 0, bmpSrc);
        // 接着在源图下方绘制出目标图,造成倒影的感觉
        BLENDFUNCTION blendfunc={
            AC_SRC_OVER,
            0,
            255,
            AC_SRC_ALPHA
        };

        ::AlphaBlend(Canvas->Handle,
            0, nHeight, nWidth, nHeight,
            bmpDst->Canvas->Handle,
            0,0,nWidth,nHeight,
            blendfunc
            );
    }
    __finally
    {
        // 清场
        delete bmpSrc;
        delete bmpDst;
    }
}
友情提示:
信息收集于互联网,如果您发现错误或造成侵权,请及时通知本站更正或删除,具体联系方式见页面底部联系我们,谢谢。

其他相似内容:

热门推荐: