Ik ben bezig in C# om onder andere een waveform te tekenen van een wav bestand. Dat is dan ook gelukt, maar nu wil ik het plaatje gebufferd laden. Dat lukt natuurlijk ook wel, maar ik krijg het niet voor elkaar om het in de goede schaal te tekenen.
Zo moet ik het krijgen. Deze is dus goed geschaald, maar niet gebufferd

Nu heb ik het bufferen erbij gehaald maar wordt het zo:

Dat is dus alleen het beginstukje van de complete waveform, omdat het schalen niet lukt.
De code waar het om gaat:
Of zet ik bij de verkeerde Graphics instantie de schaal?
Zo moet ik het krijgen. Deze is dus goed geschaald, maar niet gebufferd
Nu heb ik het bufferen erbij gehaald maar wordt het zo:
Dat is dus alleen het beginstukje van de complete waveform, omdat het schalen niet lukt.
De code waar het om gaat:
C#:
grfx.PageScale (regel 14) krijgt wel de juiste schaal van panelScale, maar als ik daarna grfx.VisibleClipBounds bekijk heeft die nog zijn oude hoogte en breedte. Dat lijkt mij niet helemaal de bedoeling?1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
| public void Draw(PaintEventArgs pea, Pen pen) { if( waveLoaded ) { Graphics grfx; Bitmap drawing = new Bitmap( (int)pea.Graphics.VisibleClipBounds.Width, (int)pea.Graphics.VisibleClipBounds.Height, pea.Graphics); grfx = Graphics.FromImage(drawing); grfx.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighSpeed; // schalen if ( panelScale == 0.0f ) panelScale = grfx.VisibleClipBounds.Width / waveSampleCount; grfx.PageScale = panelScale; RectangleF visBounds = grfx.VisibleClipBounds; grfx.DrawLine( pen, 0, visBounds.Height / 2, visBounds.Width, visBounds.Height / 2 ); grfx.TranslateTransform( 0, visBounds.Height ); grfx.ScaleTransform( 1, -1 ); // van 8 bit naar 16 bit array Int16[] waveData16 = new Int16[ waveSampleCount ]; int j = 0; for( int i = 0; i < waveSampleCount; i++ ) { waveData16[i] = (short)(waveData[j++] + (waveData[j++] * 256)); } // lijntje tekenen short val = waveData16[ 0 ]; int prevX = 0; int prevY = (int) (( (val + 32768) * visBounds.Height ) / 65536 ); for ( int i = 0; i < waveSampleCount; i++ ) { val = waveData16[ i ]; int scaledVal = (int) (( (val + 32768) * visBounds.Height ) / 65536 ); grfx.DrawLine( pen, prevX, prevY, i, scaledVal ); prevX = i; prevY = scaledVal; if ( waveFormat.nChannels == 2 ) i++; } pea.Graphics.DrawImageUnscaled(drawing, 0, 0); //pea.Graphics.DrawImage(drawing, 0, 0); grfx.Dispose(); } } |
Of zet ik bij de verkeerde Graphics instantie de schaal?