C++ owPercent=(float)((float)colValues.Min()/ushort.MaxValue); float fHighPercent=(float)((float)colValues.Max()/ushort.MaxValue); 添
owPercent=(float)((float)colValues.Min()/ushort.MaxValue); float fHighPercent=(float)((float)colValues.Max()/ushort.MaxValue); 添加(新的SampleRangeValue(fHighPercent,fLowPercent)); } } 返回colOutputValues; } } 公共结构值 { 公众持股比例高; 公众持股比例较低; 公共值(浮子高,浮子流量) { 高百分比=高; 低百分比=流量; } }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; } } 公共结构值 { 公众持股比例高; 公众持股比例较低; 公共值(浮子高,浮子流量) { 高百分
好的,我得到了部分:>您需要控制每个像素的采样数(缩放级别),但是当我使用浮点采样(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;
}
}