首页 > 解决方案 > 垂直翻转 VCL TImage 并拉伸

问题描述

以下代码从这里采用,在 TPaintbox 上翻转和绘制 TBitmap。

void flipImageVertically(Graphics::TBitmap *pBitmap, TPaintBox* paintBox)
{
    int w = pBitmap->Width;
    int h = pBitmap->Height;
    TRect dest(getStretchedDimensions(w, h, paintBox->Width, paintBox->Height));

    TRect src(Rect(0, h, w, 0));

    Graphics::TBitmap *bmp;
    bmp = new TBitmap;
    bmp->PixelFormat = pBitmap->PixelFormat;
    bmp->SetSize(w,h);

    bmp->Canvas->Draw(0, 0, pBitmap);
    paintBox->Canvas->CopyRect(dest, bmp->Canvas, src);
    delete bmp;
}

但是,与仅将图像绘制并拉伸到画框的代码相比:

    TRect stretchedRect(getStretchedDimensions(tbm->Width, tbm->Height, paintBox->Width, paintBox->Height));
    paintBox->Canvas->StretchDraw(stretchedRect, tbm);

翻转的图像“闪闪发光”,看着饱和像素。我相信这与

    bmp->Canvas->Draw(0, 0, pBitmap);
    paintBox->Canvas->CopyRect(dest, bmp->Canvas, src);

不涉及“拉伸”绘制的代码行。

尝试将上述代码更改为使用拉伸绘制:

    paintBox->Canvas->StretchDraw(dest, bmp);

而不是 CopyRect 不起作用。它仍然显示闪闪发光的像素,并且没有翻转。(刚刚意识到上面的代码水平翻转图像)。位图是 8 位灰度位图。

原来的: 在此处输入图像描述

翻转: 在此处输入图像描述

更新 将像素格式更改为 pf32Bit 确实可以解决大部分问题。然而,当拉伸到小于原始尺寸时,黑色“正方形”和其他图案会出现在图像的各个部分。见下文:

在此处输入图像描述

标签: bitmapc++buildervcl

解决方案


推荐阅读