@@ -10,25 +10,84 @@ public override void GetData(object target, Stream outgoingData)
1010 switch ( target )
1111 {
1212 case Mat mat :
13- SerializeAsJson ( outgoingData , CreateDataSource ( mat , mat . ToString ( ) ) ) ;
13+ SerializeAsJson ( outgoingData , CreateDataSource ( mat ) ) ;
1414 break ;
1515 case UMat umat :
16- SerializeAsJson ( outgoingData , CreateDataSource ( umat , umat . ToString ( ) ) ) ;
16+ SerializeAsJson ( outgoingData , CreateDataSource ( umat ) ) ;
1717 break ;
1818 default :
1919 throw new NotSupportedException ( target . GetType ( ) . FullName ) ;
2020 }
2121 }
2222
23- private static MatObjectDataSource CreateDataSource ( InputArray inputArray , string description )
23+ private static MatObjectDataSource CreateDataSource ( Mat mat )
2424 {
25- _ = Cv2 . ImEncode ( ".png" , inputArray , out var buffer ) ;
25+ using var pngWriteableMat = PreparePngMat ( mat ) ;
26+ _ = Cv2 . ImEncode ( ".png" , pngWriteableMat , out var buffer ) ;
27+
2628 return new MatObjectDataSource
2729 {
2830 PngDataBase64 = Convert . ToBase64String ( buffer ) ,
29- Width = inputArray . Size ( ) . Width ,
30- Height = inputArray . Size ( ) . Height ,
31- Description = description
31+ Width = mat . Width ,
32+ Height = mat . Height ,
33+ Description = mat . ToString ( )
3234 } ;
3335 }
36+
37+ private static MatObjectDataSource CreateDataSource ( UMat umat )
38+ {
39+ using var mat = umat . GetMat ( AccessFlag . READ ) ;
40+ using var pngWriteableMat = PreparePngMat ( mat ) ;
41+ _ = Cv2 . ImEncode ( ".png" , pngWriteableMat , out var buffer ) ;
42+
43+ return new MatObjectDataSource
44+ {
45+ PngDataBase64 = Convert . ToBase64String ( buffer ) ,
46+ Width = umat . Width ,
47+ Height = umat . Height ,
48+ Description = umat . ToString ( )
49+ } ;
50+ }
51+
52+ private static Mat PreparePngMat ( Mat mat )
53+ {
54+ var matType = mat . Type ( ) ;
55+
56+ if ( matType . Depth == MatType . CV_USRTYPE1 )
57+ {
58+ throw new NotSupportedException ( "Unsupported MatType: CV_USRTYPE1" ) ;
59+ }
60+ else if ( matType . IsInteger && matType . Channels != 2 )
61+ {
62+ return mat . Clone ( ) ;
63+ }
64+ else if ( matType . Channels == 1 )
65+ {
66+ var result = new Mat ( mat . Size ( ) , MatType . CV_8UC1 ) ;
67+ mat . ConvertTo ( result , MatType . CV_8UC1 , 255.0 ) ;
68+ return result ;
69+ //return matType.Depth == MatType.CV_32F ? PrepareFloatImage(mat) : PrepareDoubleImage(mat);
70+ }
71+ else if ( matType . Channels == 3 )
72+ {
73+ var result = new Mat ( mat . Size ( ) , MatType . CV_8UC3 ) ;
74+ mat . ConvertTo ( result , MatType . CV_8UC3 , 255.0 ) ;
75+ return result ;
76+ }
77+ else if ( matType . Channels == 4 )
78+ {
79+ var result = new Mat ( mat . Size ( ) , MatType . CV_8UC4 ) ;
80+ mat . ConvertTo ( result , MatType . CV_8UC4 , 255.0 ) ;
81+ return result ;
82+ }
83+ else if ( matType . Channels == 2 )
84+ {
85+ Cv2 . Split ( mat , out var twoChannels ) ;
86+ var channels = new [ ] { twoChannels [ 0 ] , twoChannels [ 1 ] , twoChannels [ 0 ] } ;
87+ var result = new Mat ( mat . Size ( ) , MatType . CV_8UC3 ) ;
88+ Cv2 . Merge ( channels , result ) ;
89+ return result ;
90+ }
91+ throw new NotSupportedException ( "Unknown Mat format" ) ;
92+ }
3493}
0 commit comments