예제 #1
0
            /// <summary>
            /// JPEGデータから量子化後のDCT係数列を取得する。
            /// </summary>
            /// <param name="jpegData">JPEGデータ</param>
            /// <param name="qdctCoeff">量子化後のDCT係数列構造体</param>
            /// <param name="qFactor">QFactor</param>
            /// <returns>処理結果</returns>
            public bool GetQuantizedDCTCoeff(byte[] jpegData, out QDCTCoefficientParameter qdctCoeff, out ushort qFactor)
            {
                qdctCoeff = new QDCTCoefficientParameter();
                qFactor   = 0;

                if (jpegData == null || jpegData.Length < 2)
                {
                    //return ReturnID.ErrorInvalidParam;
                    return(false);
                }

                _jpegData        = (byte[])jpegData.Clone();
                _jpegDataIndex   = 0;
                _remainSize      = jpegData.Length;
                _remainBitLength = 8;
                _qdctCoeffParam  = new QDCTCoefficientParameter();
                _hiYCR           = 0;
                _viYCR           = 0;

                // JPEGデータの先頭にSOIマーカがなければならない。
                if ((byte)JpegMarkerCodes.MARKER_ID != _jpegData[0] || (byte)JpegMarkerCodes.SOI != _jpegData[1])
                {
                    // JPEGデータの先頭にSOIマーカがない
                    //return ReturnID.JpegDataErrorNoSOIMarker;
                    return(false);
                }

                _jpegDataIndex += 2;
                _remainSize    -= 2;

                // スキャンデータ直前までの全マーカを読み出す。正常終了時、SOSマーカセグメントまで既読。
                ReturnID returnID = ReadMarkersBeforeScanData(out bool readDHT, out bool readSOF0, out ushort restartInterval, out qFactor);

                if (ReturnID.Success == returnID)
                {
                    if (!readDHT || !readSOF0)
                    {
                        returnID = ReturnID.JpegDataErrorLackOfMarker;
                    }
                    else if (restartInterval != 0)
                    {
                        returnID = ReturnID.JpegDataErrorUnsupported;
                    }
                    else
                    {
                        returnID = ReadScanData();
                    }
                }

                if (ReturnID.Success != returnID)
                {
                    _qdctCoeffParam.YComponents = null;
                }

                _qdctCoeffParam.Copy(ref qdctCoeff);

                return(ReturnID.Success == returnID);
            }
예제 #2
0
 /// <summary>
 /// 値をコピーする
 /// </summary>
 /// <param name="qdctCoeffParam">コピー先</param>
 public void Copy(ref QDCTCoefficientParameter qdctCoeffParam)
 {
     if (qdctCoeffParam != null)
     {
         qdctCoeffParam.Width     = Width;
         qdctCoeffParam.Height    = Height;
         qdctCoeffParam.BlockNumX = BlockNumX;
         qdctCoeffParam.BlockNumY = BlockNumY;
         if (YComponents != null)
         {
             qdctCoeffParam.YComponents = (YComponents == null ? null : (short[])YComponents.Clone());
         }
     }
 }