Переверните VCL TImage вертикально и растяните - PullRequest
0 голосов
/ 31 января 2020

Следующий код, принятый из здесь , переворачивает и рисует TBitmap на TPaintbox.

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;
}

Однако, по сравнению с кодом, который просто рисует и растягивает изображение до Paintbox:

    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-битное растровое изображение в оттенках серого.

Оригинал: enter image description here

Отражено: enter image description here

Обновление Изменение формата пикселя на pf32Bit решает большинство проблем. Однако при растяжении до меньшего размера, чем исходное, на разных частях изображения появляются черные «квадраты» и другие узоры. См. Ниже:

enter image description here

...