【发布时间】:2017-10-28 01:01:28
【问题描述】:
我正在尝试找到最简单的方法来旋转 TBitmap 在其中心按所需的任何给定角度显示。 TBitmap 是方形的,只要旋转位图的中心点保持不变,任何可能发生的剪切都不重要。图像非常小,只有大约 50 x 50 像素,所以速度不是问题。这是我到目前为止的代码,它将TBitmap 旋转到 90 度,这很简单,任何角度的事情都不那么简单。
std::auto_ptr<Graphics::TBitmap> bitmap1(new Graphics::TBitmap);
std::auto_ptr<Graphics::TBitmap> bitmap2(new Graphics::TBitmap);
bitmap1->LoadFromFile("c:/myimage.bmp");
bitmap1->Transparent = true;
bitmap1->TransparentColor = bitmap1->Canvas->Pixels[50][50];
bitmap2->Width=bitmap1->Height;
bitmap2->Height=bitmap1->Width;
double x1 = 0.0;
double y1 = 0.0;
for (int x = 0;x < bitmap1->Width; x++)
{
for(int y = 0;y < bitmap1->Height;y++)
{
x1 = std::cos(45.0) * x - std::sin(45.0) * y;
y1 = sin(45.0) * x + cos(45.0) * y;
bitmap2->Canvas->Pixels[x1][y1] =
bitmap1->Canvas->Pixels[x][y];
}
}
Form1->Canvas->Draw( 500, 200, bitmap2.get());
查看修改后的代码...这允许旋转,但副本会创建模糊图像并且旋转点位于左上角。
【问题讨论】:
-
@Raw N 问题就在那里......你的意思是编辑我的帖子以包含答案吗?
-
你想实现一个rotation matrix。大多数图形包都有一个现成的矩阵变换库。
-
天下没有免费的午餐。您需要学习用于旋转和位置的矩阵图元。 (或者只是调整我指出您处理居中问题的代码)。任何有关图形的教科书都会教您使用矩阵进行此类运算的原理。一堆矩阵运算是任何图形库包的基础。您可能还需要对旋转图像进行插值和平滑处理,因为每个转换后的像素位置都不会位于整数边界上。因此,学习原理,或者找一个图书馆为你做这件事。
-
即使您不使用矩阵,也必须先从 x 和 y 坐标中提取 mddle,然后再与正弦/余弦相乘(稍后以转换后的形式将它们添加回来),否则您的中心确实不是旋转中心。但只需注意使用矩阵和/或图形包的建议。这要容易得多,并且可能会创建更清晰的图像。乍一看,这并不像看起来那么容易。
标签: c++builder tbitmap