C++Builder图片旋转问题

attor 2019-03-21 10:41:59
图片是从数据库里面取的,画在PaintBox控件上,想在绘图之前加一个图片旋转角度,画出来的是旋转之后的图片。
TPaintBox *Image2 = new TPaintBox(this);
Image2->Parent=this;
Image2->Enabled=false;
if(angle>180)angle=360-angle;
if(angle<-180)angle=360+angle;
float radians=(2*3.1416*angle)/360;
float cosine=(float)cos(radians);
float sine=(float)sin(radians);
float Point1x=(-Image1->Height*sine);
float Point1y=(Image1->Height*cosine);
float Point2x=(Image1->Width*cosine-Image1->Height*sine);
float Point2y=(Image1->Height*cosine+Image1->Width*sine);
float Point3x=(Image1->Width*cosine);
float Point3y=(Image1->Width*sine);
float minx=min(0,min(Point1x,min(Point2x,Point3x)));
float miny=min(0,min(Point1y,min(Point2y,Point3y)));
float maxx=max(Point1x,max(Point2x,Point3x));
float maxy=max(Point1y,max(Point2y,Point3y));
int DestBitmapWidth,DestBitmapHeight;
if(angle>90&&angle<180)
DestBitmapWidth=(int)ceil(-minx);
else
DestBitmapWidth=(int)ceil(maxx-minx);
if(angle>-180&&angle<-90)
DestBitmapHeight=(int)ceil(-miny);
else
DestBitmapHeight=(int)ceil(maxy-miny);
Image2->Height=DestBitmapHeight;
Image2->Width=DestBitmapWidth;
for(int x=0;x<DestBitmapWidth;x++)
{
for(int y=0;y<DestBitmapHeight;y++)
{
int SrcBitmapx=(int)((x+minx)*cosine+(y+miny)*sine);
int SrcBitmapy=(int)((y+miny)*cosine-(x+minx)*sine);
if(SrcBitmapx>=0&&SrcBitmapx<Image1->Width&&SrcBitmapy>=0&&
SrcBitmapy<Image1->Height)
{
Image2->Canvas->Pixels[x][y]=PaintBox1->Canvas->Pixels[SrcBitmapx][SrcBitmapy];
}
}
}
BitBlt(PaintBox1->Canvas->Handle, 0, 0, PaintBox1->ClientWidth, PaintBox1->ClientHeight, Image2->Canvas->Handle, 0, 0, SRCCOPY);
delete Image2;

这样子太慢了,有其他好的方法吗
...全文
352 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
attor 2019-03-26
  • 打赏
  • 举报
回复
引用 13 楼 早打大打打核战争 的回复:
[quote=引用 11 楼 hyaaaafighting 的回复:]
[quote=引用 10 楼 早打大打打核战争 的回复:]
试试:
BMP->Transparent = PNG->Transparent;
BMP->TransparentColor = PNG->TransparentColor;
BMP->TransparentMode = tmFixed;
我试了一下没用,我的源码是把PNG转BMP后旋转,再把BMP转PNG绘图[/quote]

你要转换中保持透明信息
[/quote]最后面还是用GDI+做了
ooolinux 2019-03-25
  • 打赏
  • 举报
回复
为什么要再转PNG绘图?
attor 2019-03-25
  • 打赏
  • 举报
回复
引用 10 楼 早打大打打核战争 的回复:
试试:
BMP->Transparent = PNG->Transparent;
BMP->TransparentColor = PNG->TransparentColor;
BMP->TransparentMode = tmFixed;
我试了一下没用,我的源码是把PNG转BMP后旋转,再把BMP转PNG绘图
  • 打赏
  • 举报
回复
引用 11 楼 hyaaaafighting 的回复:
[quote=引用 10 楼 早打大打打核战争 的回复:]
试试:
BMP->Transparent = PNG->Transparent;
BMP->TransparentColor = PNG->TransparentColor;
BMP->TransparentMode = tmFixed;
我试了一下没用,我的源码是把PNG转BMP后旋转,再把BMP转PNG绘图[/quote]

你要转换中保持透明信息
  • 打赏
  • 举报
回复
试试:
BMP->Transparent = PNG->Transparent;
BMP->TransparentColor = PNG->TransparentColor;
BMP->TransparentMode = tmFixed;
attor 2019-03-22
  • 打赏
  • 举报
回复
引用 8 楼 早打大打打核战争 的回复:
我测试是可以的,如果你有多线程访问TCanvas的话,可以先Lock,处理完之后再Unlock
我转成bmp之后旋转了,但是会失去透明信息,这个能解决不
  • 打赏
  • 举报
回复
我测试是可以的,如果你有多线程访问TCanvas的话,可以先Lock,处理完之后再Unlock
  • 打赏
  • 举报
回复
我测试一下...
attor 2019-03-21
  • 打赏
  • 举报
回复
引用 5 楼 早打大打打核战争 的回复:
如果用FMX的话,任意组件都支持旋转、缩放、3D空间变换,用VCL,其他格式需要复制到TBitmap再处理(TPngImage实际上也支持TCanvas,可以直接操作,但是会丢失透明信息)。
tmpJpeg->Canvas->pixels写在循环里会报错(Canvas dose not allow drawing),只能用控件->Canvas
  • 打赏
  • 举报
回复
如果用FMX的话,任意组件都支持旋转、缩放、3D空间变换,用VCL,其他格式需要复制到TBitmap再处理(TPngImage实际上也支持TCanvas,可以直接操作,但是会丢失透明信息)。
attor 2019-03-21
  • 打赏
  • 举报
回复
因为是在公司源码上添加新功能,换一个问题,
TPngImage *tmpJpeg=new TPngImage;
tmpJpeg->LoadFromStream(MemoryImageStream);
之后可以对tmpJpeg进行旋转吗
  • 打赏
  • 举报
回复
如果用API的话,可以用PlgBlt,这个支持空间坐标变换
  • 打赏
  • 举报
回复
建立FMX项目,直接支持旋转、缩放
ooolinux 2019-03-21
  • 打赏
  • 举报
回复
gdi+?我也不会。

1,178

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder 数据库及相关技术
社区管理员
  • 数据库及相关技术社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧