/// <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); }
/// <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()); } } }