{
CImageHandleDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
::SetWindowText(GetParent()->m_hWnd,"图像处理软件");
// TODO: add draw code for native data here
Graphics graph(pDC->GetSafeHdc());
graph.DrawImage(bitmap,Destrect,Srcrect.X,Srcrect.Y,Srcrect.Width,Srcrect.Height,UnitPixel,&imageAttr);
ReleaseDC(pDC);
}
(其中Destrect是进行缩放,Srcrect是进行剪切时使用,imageAttr预留给设置透明度时使用)
我是想先显示一张图像,然后对该图像进行设置图明度,调用OnDraw进行重绘。
void CImageHandleView::OnColorhandle()
{
// TODO: Add your command handler code here
ColorHandle color; //ColorHandle定义了一个对话框,从中传透明度值过来
float f;
if(bitmap->GetLastStatus()!=Ok)
return;
if(color.DoModal()==IDOK)
{
m_Transparent=color.transparent;
if(m_Transparent!=0)
{
f=m_Transparent/100.0f;
ColorMatrix colormatrix=
{1,0,0,0,0,
0,1,0,0,0,
0,0,1,0,0,
0,0,0,f,0,
0,0,0,0,1};
imageAttr.SetColorMatrix(&colormatrix,ColorMatrixFlagsDefault,ColorAdjustTypeBitmap);
Invalidate();
UpdateWindow();
}
}
但是这样之后图像只是闪一下,透明度并无变化。为什么?怎么解决?
高手给看哈,不胜感激!
9 个解决方案
#1
友情UP
#2
ReleaseDC(pDC);
首先这句就应该去掉!
首先这句就应该去掉!
#3
为什么?
#4
你的DC是函数参数传给你的,不是你自己通过GetDC获得的!
#5
void CImageHandleView::OnDraw(CDC* pDC)
{
CImageHandleDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
::SetWindowText(GetParent()->m_hWnd,"图像处理软件");
// TODO: add draw code for native data here
Graphics graph(pDC->GetSafeHdc());
ImageAttributes imageAtt;
imageAttr.SetColorMatrix(&colormatrix,ColorMatrixFlagsDefault,ColorAdjustTypeBitmap);
graph.DrawImage(bitmap,Destrect,Srcrect.X,Srcrect.Y,Srcrect.Width,Srcrect.Height,UnitPixel,&imageAttr);
}
改成这样,把 colormatrix作为成员变量,试试!
{
CImageHandleDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
::SetWindowText(GetParent()->m_hWnd,"图像处理软件");
// TODO: add draw code for native data here
Graphics graph(pDC->GetSafeHdc());
ImageAttributes imageAtt;
imageAttr.SetColorMatrix(&colormatrix,ColorMatrixFlagsDefault,ColorAdjustTypeBitmap);
graph.DrawImage(bitmap,Destrect,Srcrect.X,Srcrect.Y,Srcrect.Width,Srcrect.Height,UnitPixel,&imageAttr);
}
改成这样,把 colormatrix作为成员变量,试试!
#6
另外楼主看看这个,看看是否有帮助:
http://tech.ddvip.com/2008-11/122587489289349.html
http://tech.ddvip.com/2008-11/122587489289349.html
#7
我觉得是没有把原先的图片(alpha为255,也就是不透明的时候)擦除就直接在上面绘制了。这样的话当然看不出透明度。你改成这样试下:
void CImageHandleView::OnDraw(CDC* pDC)
{
CImageHandleDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
::SetWindowText(GetParent()->m_hWnd,"图像处理软件");
Graphics graph(pDC->GetSafeHdc());
graph.Clear(Color::White); // 先把背景清空为白色,再绘制
graph.DrawImage(bitmap,Destrect,Srcrect.X,Srcrect.Y,Srcrect.Width,Srcrect.Height,UnitPixel,&imageAttr);
ReleaseDC(pDC);
}
#8
按照楼上的说法做了,但是还是不行啊
#9
imageAttr.SetColorMatrix()这个函数设置透明度后更改了bitmap对应的数据没有? 你自己单步调试下
#1
友情UP
#2
ReleaseDC(pDC);
首先这句就应该去掉!
首先这句就应该去掉!
#3
为什么?
#4
你的DC是函数参数传给你的,不是你自己通过GetDC获得的!
#5
void CImageHandleView::OnDraw(CDC* pDC)
{
CImageHandleDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
::SetWindowText(GetParent()->m_hWnd,"图像处理软件");
// TODO: add draw code for native data here
Graphics graph(pDC->GetSafeHdc());
ImageAttributes imageAtt;
imageAttr.SetColorMatrix(&colormatrix,ColorMatrixFlagsDefault,ColorAdjustTypeBitmap);
graph.DrawImage(bitmap,Destrect,Srcrect.X,Srcrect.Y,Srcrect.Width,Srcrect.Height,UnitPixel,&imageAttr);
}
改成这样,把 colormatrix作为成员变量,试试!
{
CImageHandleDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
::SetWindowText(GetParent()->m_hWnd,"图像处理软件");
// TODO: add draw code for native data here
Graphics graph(pDC->GetSafeHdc());
ImageAttributes imageAtt;
imageAttr.SetColorMatrix(&colormatrix,ColorMatrixFlagsDefault,ColorAdjustTypeBitmap);
graph.DrawImage(bitmap,Destrect,Srcrect.X,Srcrect.Y,Srcrect.Width,Srcrect.Height,UnitPixel,&imageAttr);
}
改成这样,把 colormatrix作为成员变量,试试!
#6
另外楼主看看这个,看看是否有帮助:
http://tech.ddvip.com/2008-11/122587489289349.html
http://tech.ddvip.com/2008-11/122587489289349.html
#7
我觉得是没有把原先的图片(alpha为255,也就是不透明的时候)擦除就直接在上面绘制了。这样的话当然看不出透明度。你改成这样试下:
void CImageHandleView::OnDraw(CDC* pDC)
{
CImageHandleDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
::SetWindowText(GetParent()->m_hWnd,"图像处理软件");
Graphics graph(pDC->GetSafeHdc());
graph.Clear(Color::White); // 先把背景清空为白色,再绘制
graph.DrawImage(bitmap,Destrect,Srcrect.X,Srcrect.Y,Srcrect.Width,Srcrect.Height,UnitPixel,&imageAttr);
ReleaseDC(pDC);
}
#8
按照楼上的说法做了,但是还是不行啊
#9
imageAttr.SetColorMatrix()这个函数设置透明度后更改了bitmap对应的数据没有? 你自己单步调试下