C++ owPercent=(float)((float)colValues.Min()/ushort.MaxValue); float fHighPercent=(float)((float)colValues.Max()/ushort.MaxValue); 添

C++ owPercent=(float)((float)colValues.Min()/ushort.MaxValue); float fHighPercent=(float)((float)colValues.Max()/ushort.MaxValue); 添,c++,audio,waveform,bass,C++,Audio,Waveform,Bass,owPercent=(float)((float)colValues.Min()/ushort.MaxValue); float fHighPercent=(float)((float)colValues.Max()/ushort.MaxValue); 添加(新的SampleRangeValue(fHighPercent,fLowPercent)); } } 返回colOutputValues; } } 公共结构值 { 公众持股比例高; 公众持股比例较低; 公共值(浮子高,浮子流量) { 高百分

owPercent=(float)((float)colValues.Min()/ushort.MaxValue); float fHighPercent=(float)((float)colValues.Max()/ushort.MaxValue); 添加(新的SampleRangeValue(fHighPercent,fLowPercent)); } } 返回colOutputValues; } } 公共结构值 { 公众持股比例高; 公众持股比例较低; 公共值(浮子高,浮子流量) { 高百分比=高; 低百分比=流量; } }
好的,我得到了部分:>您需要控制每个像素的采样数(缩放级别),但是当我使用浮点采样(1.40129846432482E-045,0,9224.40234375,1.740283773227E-039,1.74042390307914E-039)时,您建议在绘图时使用什么?这是一个向下/向上取整的解决方案,还是我必须精确?我的意思是1.40129846432482E-045可以被绘图函数视为1而没有问题?和thanx快速回复一些绘图API支持浮点数。如果没有,那么您可能需要自己添加支持。例如,如果y值为1,则在1处绘制一个黑点(在白色背景上)。如果该值为1.5,则在1和2上绘制一个灰点(50%色调)。这并不是很容易做到50%色调。你没有考虑到颜色空间不是线性的这一事实。一半的亮度实际上是21%。。。TBH您最好只舍入到最接近的整数,并在接受别名时以这种方式处理它。它不太可能那么糟糕。我使用CordPoice C++ Builder在Windows上工作,所以对于GUI我使用VCLA非常完整的答案。这里只有一个小的补充:我所知道的绘制波形的程序甚至将预先计算好的最小/最大表持久地缓存在一个文件中。对于答案,我将尝试使用这个想法实现一个控件。@h0b0:是的,峰值文件可以使第二次重新打开文件更便宜,但在第一次打开文件时,它根本没有帮助,用户不喜欢他们乱扔磁盘的方式。这是判断他们是否对你的申请有意义。
TInterval EditZone = WaveForm->GetSelection();
struct TInterval
{
    long Start;
    long End;
}
public class WavReader2
{
    private readonly WaveFileReader _objStream;

    public WavReader2(String sPath)
    {
        _objStream = new WaveFileReader(sPath);
    }

    public List<SampleRangeValue> GetPixelGraph(int iSamplesPerPixel)
    {
        List<SampleRangeValue> colOutputValues = new List<SampleRangeValue>();

        if (_objStream != null)
        {
            _objStream.Position = 0;
            int iBytesPerSample = (_objStream.WaveFormat.BitsPerSample / 8) * _objStream.WaveFormat.Channels;
            int iNumPixels = (int)Math.Ceiling(_objStream.SampleCount/(double)iSamplesPerPixel);

            byte[] aryWaveData = new byte[iSamplesPerPixel * iBytesPerSample];
            _objStream.Position = 0; // startPosition + (e.ClipRectangle.Left * iBytesPerSample * iSamplesPerPixel);

            for (float iPixelNum = 0; iPixelNum < iNumPixels; iPixelNum += 1)
            {
                short iCurrentLowValue = 0;
                short iCurrentHighValue = 0;
                int iBytesRead = _objStream.Read(aryWaveData, 0, iSamplesPerPixel * iBytesPerSample);
                if (iBytesRead == 0)
                    break;

                List<short> colValues = new List<short>();
                for (int n = 0; n < iBytesRead; n += 2)
                {
                    short iSampleValue = BitConverter.ToInt16(aryWaveData, n);
                    colValues.Add(iSampleValue);
                }

                float fLowPercent =  (float)((float)colValues.Min() /ushort.MaxValue);
                float fHighPercent = (float)((float)colValues.Max() / ushort.MaxValue);

                colOutputValues.Add(new SampleRangeValue(fHighPercent, fLowPercent));
            }
        }

        return colOutputValues;
    }
}

public struct SampleRangeValue
{
    public float HighPercent;
    public float LowPercent;
    public SampleRangeValue(float fHigh, float fLow)
    {
        HighPercent = fHigh;
        LowPercent = fLow;
    }
}