一个关于图像分割的问题

JerryAndJoy 2003-09-13 12:05:17
我想做一个拼图游戏,1.要先把用户选的图片缩小,2.然后再分割成9块,用什么函数可以做到?

请大家赐教,小弟在这儿先谢了~.~

...全文
52 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
cliff166 2003-10-05
  • 打赏
  • 举报
回复
这不是图像分割的范围,以后发表帖子请用词准确,谢谢!
yjy1001 2003-09-20
  • 打赏
  • 举报
回复
用一个隐藏的image做母板,计算好位置用copyrect来copy过你的panel里就可以了
JerryAndJoy 2003-09-18
  • 打赏
  • 举报
回复
好的,我试试你那种方法。

主要是,我以前对那个函数不熟悉,而且,当时时间很紧

现在我准备重写那部分的代码了,多多支持我哈!! ^_^
weibz0525 2003-09-18
  • 打赏
  • 举报
回复
你的意思应该是在每一个Image装载一个完整的图象,然后通过改变Image大小来显示图象的某一部分吧?
这种方法即使行的通,也是极大的浪费,你看我上边给你的程序了吗?
用copyrect方法把图象拷入你那9个image还差不多,
JerryAndJoy 2003-09-17
  • 打赏
  • 举报
回复
不好意思哈,现在才上来,我们这边的网络出问题了。

此间我想出了一个方法,有点笨,就是用一个 Bevel 作底(为了好看),然后在里面放入9个Panel,9个Panel放在一起的大小,就是图片载入时的大小然后在每个 Panel 里都放一个 Image ,再改变Image在Panel里的相对位置,看上去就像图像被分割了

但是现在遇到问题了,无论如何都不能让图片按照我的意思移动,每次Image11 的值都不变,是不是这种地址返回是行不通的哦,以下是源代码:

void __fastcall TForm1::Image2Click(TObject *Sender)
{
ChangeImage ( Image2 , Image11 );
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Image3Click(TObject *Sender)
{
ChangeImage ( Image3 , Image11 );
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Image5Click(TObject *Sender)
{
ChangeImage ( Image5 , Image11 );
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Image8Click(TObject *Sender)
{
ChangeImage ( Image8 , Image11 );
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Image6Click(TObject *Sender)
{
ChangeImage ( Image6 , Image11 );
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Image9Click(TObject *Sender)
{
ChangeImage ( Image9 , Image11 );
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Image10Click(TObject *Sender)
{
ChangeImage ( Image10 , Image11 );
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Image7Click(TObject *Sender)
{
ChangeImage ( Image7 , Image11 );
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Image4Click(TObject *Sender)
{
ChangeImage ( Image4 , Image11 );
}
//---------------------------------------------------------------------------

void __fastcall TForm1::ChangeImage ( TImage *ImageM , TImage *ImageN)
{
if (!((ImageM->Left != ImageN->Left)&&(ImageM->Top != ImageN->Top)))
{
if ((abs(ImageM->Left - ImageN->Left)<=129)&&(abs(ImageM->Top -ImageN->Top)<=97))
{
SuperX = ImageN->Left ;
SuperY = ImageN->Top ;
ImageN->Left = ImageM->Left ;
ImageN->Top = ImageM->Top ;
ImageM->Left = SuperX ;
ImageM->Top = SuperY ;
ImageN->Visible = true ;
ImageM->Visible = false ;
ImageN = ImageM ;
Image11 = ImageM ;
if ((Image9->Left == -258)&&(Image9->Top == -194))
{
if (((Image2->Left == 0)&&(Image2->Top == 0))&&((Image3->Left == -129)&&(Image3->Top == 0))&&((Image4->Left == -258)&&(Image4->Top == 0))&&((Image5->Left == 0)&&(Image5->Top == -97))&&((Image6->Left == -194)&&(Image6->Top == -97))&&((Image7->Left == -258)&&(Image7->Top == -97))&&((Image8->Left == 0)&&(Image8->Top == -194))&&((Image9->Left == -129)&&(Image9->Top == -194))&&((Image10->Left == -258)&&(Image10->Top == -194)))
{
Label4->Caption="Successed!!!";
Image10->Visible = true ;
}
}
else
Label4->Caption = "Every Thing is OK~~~!!!!";
}
else
Label4->Caption = "Dead in Second Pass~~";
}
else
Label4->Caption = "Dead in First Pass~";
}
weibz0525 2003-09-15
  • 打赏
  • 举报
回复
写的很罗嗦,自己改改吧,
从文件中倒入图象,切割成九块后显示到Image控件上,
int suoxiao=100;
int SingleWidth,SingleHeight;
//图象缩小
Graphics::TBitmap* pBitmap = new Graphics::TBitmap;
Graphics::TBitmap* NewBitmap = new Graphics::TBitmap;
pBitmap->LoadFromFile("c:\\1.bmp");
pBitmap->Width=pBitmap->Width-suoxiao;
pBitmap->Height=pBitmap->Height-suoxiao;
TRect NewRect(0, 0, pBitmap->Width, pBitmap->Height);
pBitmap->Canvas->StretchDraw(NewRect, pBitmap);
//切割成9块
SingleWidth=pBitmap->Width/3;
SingleHeight=pBitmap->Height/3;
NewBitmap->Width=pBitmap->Width+10;
NewBitmap->Height=pBitmap->Height+10;
TRect SrcRect1(0,0,SingleWidth,SingleHeight);
TRect DestRect1(0,0,SingleWidth,SingleWidth);
NewBitmap->Canvas->CopyRect(DestRect1,pBitmap->Canvas,SrcRect1);
TRect SrcRect2(SingleWidth,0,2*SingleWidth,SingleHeight);
TRect DestRect2(SingleWidth+5,0,2*SingleWidth+5,SingleHeight);
NewBitmap->Canvas->CopyRect(DestRect2,pBitmap->Canvas,SrcRect2);
TRect SrcRect3(2*SingleWidth,0,pBitmap->Width,SingleHeight);
TRect DestRect3(2*SingleWidth+10,0,pBitmap->Width+10,SingleHeight);
NewBitmap->Canvas->CopyRect(DestRect3,pBitmap->Canvas,SrcRect3);
TRect SrcRect4(0,SingleHeight,SingleWidth,2*SingleHeight);
TRect DestRect4(0,SingleHeight+5,SingleWidth,2*SingleHeight+5);
NewBitmap->Canvas->CopyRect(DestRect4,pBitmap->Canvas,SrcRect4);
TRect SrcRect5(SingleWidth,SingleHeight,2*SingleWidth,2*SingleHeight);
TRect DestRect5(SingleWidth+5,SingleHeight+5,2*SingleWidth+5,2*SingleHeight+5);
NewBitmap->Canvas->CopyRect(DestRect5,pBitmap->Canvas,SrcRect5);
TRect SrcRect6(2*SingleWidth,SingleHeight,pBitmap->Width,2*SingleHeight);
TRect DestRect6(2*SingleWidth+10,SingleHeight+5,pBitmap->Width+10,2*SingleHeight+5);
NewBitmap->Canvas->CopyRect(DestRect6,pBitmap->Canvas,SrcRect6);
TRect SrcRect7(0,pBitmap->Height-SingleHeight,SingleWidth,pBitmap->Height);
TRect DestRect7(0,pBitmap->Height-SingleHeight+10,SingleWidth,pBitmap->Height+10);
NewBitmap->Canvas->CopyRect(DestRect7,pBitmap->Canvas,SrcRect7);
TRect SrcRect8(SingleWidth,pBitmap->Height-SingleHeight,2*SingleWidth,pBitmap->Height);
TRect DestRect8(SingleWidth+5,pBitmap->Height-SingleHeight+10,2*SingleWidth+5,pBitmap->Height+10);
NewBitmap->Canvas->CopyRect(DestRect8,pBitmap->Canvas,SrcRect8);
TRect SrcRect9(2*SingleWidth,pBitmap->Height-SingleHeight,pBitmap->Width,pBitmap->Height);
TRect DestRect9(pBitmap->Width-SingleWidth+10,pBitmap->Height-SingleHeight+10,pBitmap->Width+10,pBitmap->Height+10);
NewBitmap->Canvas->CopyRect(DestRect9,pBitmap->Canvas,SrcRect9);
Image1->Picture->Bitmap->Assign(NewBitmap);
delete pBitmap;
delete NewBitmap;
binbin 2003-09-14
  • 打赏
  • 举报
回复
对,BitBlt和StreachBlt可以一次复制一部分,不用一像素一像素做了.
kingcaiyao 2003-09-13
  • 打赏
  • 举报
回复
可参照API的两个函数:BitBlt,StreachBlt
JerryAndJoy 2003-09-13
  • 打赏
  • 举报
回复
哦,谢谢~
binbin 2003-09-13
  • 打赏
  • 举报
回复
应该没有现成的东东,最笨的方法就是自己计算,然后按像素一行行读出来写到新图片中.
JerryAndJoy 2003-09-13
  • 打赏
  • 举报
回复
这个我想过,但我不知道,中见会遇到什么函数可以帮我做这个事,我很菜,才学cb,望不略赐教,详细到函数,我摸索也可以有方向。
binbin 2003-09-13
  • 打赏
  • 举报
回复
什么函数可以做到?自己写的函数能做到!

13,825

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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