none
请问在缩放时候如何控制从图片的中央缩放,而不是左上角开始缩放,具体请看Skydrive上的Demo RRS feed

  • 问题

  • 请问在缩放时候如何控制从图片的中央缩放,而不是左上角开始缩放,具体请看Skydrive上的Demo

    上述demo的效果是缩放和平移在图片的范围;

    目前缩放只能从左上角开始,但是我需要缩放图片是从图片的正面开始缩放,请问如何才能控制呢?

    	D2D1_MATRIX_3X2_F scale = D2D1::Matrix3x2F::Scale(D2D1::SizeF(m_dScale, m_dScale), D2D1::Point2F(0.0f, 0.0f));
    	D2D1_MATRIX_3X2_F translation = D2D1::Matrix3x2F::Translation(m_iOffsetX, m_iOffsetY);
    	g_pRenderTarget->SetTransform(scale* translation);
    
    	D2D1_POINT_2F upperLeftCorner = D2D1::Point2F(0.0f, 0.0f);
    	// Draw bitmap
    	g_pRenderTarget->DrawBitmap(
    		g_pBitmap,
    		D2D1::RectF(
    		upperLeftCorner.x,
    		upperLeftCorner.y,
    		upperLeftCorner.x + size.width,
    		upperLeftCorner.y + size.height)
    		);

    我Demo的下载地址如下:(注:运行时需要GyrometerSensor)

    Demo是:ZoomPanDesktopD2DApp.7z文件

    https://onedrive.live.com/?cid=d2327ea047e691b7#cid=D2327EA047E691B7&id=D2327EA047E691B7%21105

    2014年3月25日 6:55

答案

全部回复

  • 请求大神帮助,我不知道如何才能得到我想要的缩放效果;

    现在是从左上角开始缩放;我想要的是从图片正面的中心开始缩放

    2014年3月25日 8:27
  • 说明:在屏幕上保持2个TouchPoint就能进入Zoom模式;保持1个TouchPoint就能进入Pan模式
    2014年3月26日 0:26
  • 我已经修复Issue,抱歉打扰
    • 已标记为答案 Wayne1900 2014年3月26日 6:55
    2014年3月26日 6:54
  • 你好,

    请问你是如何解决的,能否分享一下你的方案,十分感谢。


    We are trying to better understand customer views on social support experience, so your participation in this interview project would be greatly appreciated if you have time. Thanks for helping make community forums a great place.
    Click HERE to participate the survey.

    2014年3月26日 8:12
  • void ZoomPanImage()
    {
    	if (m_dScale > 1)
    	{
    		if (m_dScale > 4)
    			m_dScale = 4;
    	}
    
    	CreateD2DResource(g_Hwnd);
    
    	g_pRenderTarget->BeginDraw();
    
    	// Clear background color to white
    	g_pRenderTarget->Clear(D2D1::ColorF(D2D1::ColorF::White));
    	D2D1_SIZE_F size = g_pBitmap->GetSize();
    
    	float availX = static_cast<float>(size.width  * (m_dScale - 1));
    	float availY = static_cast<float>(size.height * (m_dScale - 1));
    
    	if (m_iOffsetX >= availX/2)
    	{
    		m_iOffsetX = availX / 2;
    	}
    	else if (m_iOffsetX <= -availX / 2)
    	{
    		m_iOffsetX = -availX / 2;
    	}
    	else if ((m_iOffsetX < availX / 2) && (m_iOffsetX > -availX / 2))
    	{
    	}
    
    	if (m_iOffsetY >= availY / 2)
    	{
    		m_iOffsetY = availY / 2;
    	}
    	else if (m_iOffsetY <= -availY / 2)
    	{
    		m_iOffsetY = -availY / 2;
    	}
    	else if ((m_iOffsetY < availY / 2) && (m_iOffsetY > -availY / 2))
    	{
    	}
    
    	D2D1_MATRIX_3X2_F scale = D2D1::Matrix3x2F::Scale(D2D1::SizeF(m_dScale, m_dScale), D2D1::Point2F(size.width / 2, size.height / 2));
    	D2D1_MATRIX_3X2_F translation = D2D1::Matrix3x2F::Translation(m_iOffsetX, m_iOffsetY);
    	g_pRenderTarget->SetTransform(scale* translation);
    
    	D2D1_POINT_2F upperLeftCorner = D2D1::Point2F(0.f, 0.f);
    	// Draw bitmap
    	g_pRenderTarget->DrawBitmap(
    		g_pBitmap,
    		D2D1::RectF(
    		upperLeftCorner.x,
    		upperLeftCorner.y,
    		upperLeftCorner.x + size.width,
    		upperLeftCorner.y + size.height)
    		);
    
    	HRESULT hr = g_pRenderTarget->EndDraw();
    	if (FAILED(hr))
    	{
    		MessageBox(NULL, "Draw failed!", "Error", 0);
    		return;
    	}
    }
    2014年3月27日 1:45
  • 缩放的时候注意CenterPoint与缩放时候的边界范围就好了
    2014年3月27日 1:46