2009-05-28 18 views
6

मैं एक घुमावदार छवि को एक गंतव्य बफर में जीडीआई + का उपयोग कर केंद्र में रखने की कोशिश कर रहा हूं। स्रोत बफर और गंतव्य बफर विभिन्न आकार हैं।मैं जीडीआई + का उपयोग कर घुमावदार छवि कैसे केंद्रित करूं?

स्रोत बफर छवि डेटा का आकार है: (चौड़ाई, ऊंचाई)
गंतव्य बफर भरने के लिए आवश्यक आयत का आकार है घूर्णन छवि: (घुमावदार चौड़ाई, घुमावदार हाइट)

// Calculate the size needed for the image to be rotated into 
int width = /* some width */; 
int height = /* some height */; 
System::Windows::Size destSize 
    = IPMathUtilities::CalculateRotatedImageSize(rotateAreaBoundingPoints, 
    rotationDegree, width, height); 

// 
// Create source bitmap object 
Bitmap^ sourceBitmap = gcnew Bitmap(width, height, width * 2, 
    PixelFormat::Format16bppRgb555, ptrSourceBuffer); 

// 
// Create destination bitmap object 
int destBufferSize = destSize.Width * destSize.Height * 2; 
BYTE* pDestBuffer = new BYTE[destBufferSize]; 
memset(pDestBuffer, 0, destBufferSize); 
Bitmap^ destBitmap = gcnew Bitmap(destSize.Width, destSize.Height, 
    destSize.Width * 2, PixelFormat::Format16bppRgb555, (IntPtr)pDestBuffer); 

// 
// Draw rotated source image in destination image 
Graphics^ g = Graphics::FromImage(destBitmap); 
g->TranslateTransform(-width/2, -height/2); 
g->RotateTransform(rotationDegree, MatrixOrder::Append); 
g->TranslateTransform(destSize.Width/2.0, destSize.Height/2.0, 
    MatrixOrder::Append); 
g->DrawImage(sourceBitmap, 0, 0, width, height); 

यह लगभग काम करता है:

इस कोड मैं कोशिश कर रहा हूँ है। यह करीब है - मुझे लगता है कि ऊंचाईचौड़ाई से अधिक है, घुमावदार छवि की बाईं स्थिति गलत है। इसी प्रकार, यदि चौड़ाईऊंचाई से अधिक है, तो घुमावदार छवि की शीर्ष स्थिति गलत है।

कुछ नोट:

  • IPMathUtilities एक उपयोगिता वर्ग मैंने लिखा है।
  • मैं 100% सकारात्मक हूं कि IPMathUtilities::CalculateRotatedImageSize() पूरे घुमावदार छवि को फिट करने के लिए आवश्यक आयताकार के सही आकार की गणना करता है। 100% निश्चित मैंने इसे पूरी तरह से परीक्षण किया है और यह काम करता है।
  • मैंने हाल ही में एक समान प्रश्न पूछा: Why is iplRotate() not giving me correct results?। मैंने आईपीएल/आईपीपी को छोड़कर जीडीआई + की कोशिश की।

कोई विचार?

उत्तर

5

घुमाने के बाद, पहले छवि को मूल स्थिति में वापस ले जाएं, इसके अतिरिक्त आधे अंतर से नए कैनवास बड़े होते हैं। यदि गणना गणना में आपकी गणना वास्तव में सही है, तो इसे ठीक से फिट करना चाहिए। बस इस कोड का परीक्षण किया और यह काम करने लगता है:

g.TranslateTransform((float)(org.Width/-2), (float)(org.Height/-2)); 
g.RotateTransform(45, System.Drawing.Drawing2D.MatrixOrder.Append); 
g.TranslateTransform((float)(org.Width/2), (float)(org.Height/2), System.Drawing.Drawing2D.MatrixOrder.Append); 
g.TranslateTransform((float)((rotated.Width - org.Width)/2), (float)((rotated.Height - org.Height)/2), System.Drawing.Drawing2D.MatrixOrder.Append); 

संपादित करें: माफ करना, बेशक

g.TranslateTransform((float)(org.Width/2), (float)(org.Height/2), System.Drawing.Drawing2D.MatrixOrder.Append); 
g.TranslateTransform((float)((rotated.Width - org.Width)/2), (float)((rotated.Height - org.Height)/2), System.Drawing.Drawing2D.MatrixOrder.Append); 

वास्तव में जो सिर्फ कोड आपके द्वारा पोस्ट की है

g.TranslateTransform((float)(rotated.Width/2), (float)(rotated.Height/2), System.Drawing.Drawing2D.MatrixOrder.Append); 

के समान है। हालांकि मेरे लिए ठीक काम करने लगता है।

EDIT2: शायद त्रुटि है बस

g->DrawImage(sourceBitmap, 0, 0, width, height); 

g->DrawImage(sourceBitmap, 0, 0); 

प्रयास करें बजाय

+0

आपका पहला कोड ब्लॉक कुछ मुझे याद आ रहा था - अनुवाद वापस स्रोत छवि अंतरिक्ष के लिए मूल से - वह गायब कुंजी थी। बहुत बहुत धन्यवाद। मैं केंद्रित घुमावदार छवियों के लिए बहुत राहत मिली हूँ। धन्यवाद! –

+0

लेकिन यह: जी। ट्रान्सलेट ट्रान्सफॉर्म ((फ्लोट) (org.Width/-2), (फ्लोट) (संगठन।ऊंचाई/-2)); g.RotateTransform (45, System.Drawing.Drawing2D.MatrixOrder.Append); जी। ट्रान्सलेट ट्रान्सफॉर्म ((फ्लोट) (घुमावदार। विथथ/2), (फ्लोट) (घुमावदार। हाइट/2), सिस्टम। ड्रॉइंग। ड्रॉइंग 2 डी। मैट्रिक्सऑर्डर.एपेंड); जी। ड्राय इमेज (संगठन, 0, 0); मेरे लिए काम करता है। क्या यह आपके द्वारा पोस्ट किए गए कोड के बराबर नहीं है। वैसे भी, खुशी है कि यह अब काम करता है :) –

+0

मुझे नहीं लगता कि यह समतुल्य है - मेरे मूल कोड में, घूर्णन के बाद, मुझे सीधे गंतव्य छवि स्थान पर अनुवादित किया गया था। अपने कोड में, आप पहली बार स्रोत छवि स्थान पर, फिर गंतव्य छवि स्थान पर अनुवाद कर रहे हैं। आपके पास एक अतिरिक्त अनुवाद है, जो मैं खो रहा था। :-) –

संबंधित मुद्दे