如何编程显示一个图片和图片的倒影呢?多谢
如何编程显示一个图片和图片的倒影呢?多谢
[解决办法]
越说越邪乎了,GDI很简单的代码就可以实现的效果,没有必要搞那么复杂。话不多说,直接上代码,运行的效果是最好的检验。
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; }}
[解决办法]
趁妖哥不在骗点分,改进版倒影:
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; }}