Bitmap probleem

Status
Niet open voor verdere reacties.

jan68

Gebruiker
Lid geworden
19 apr 2012
Berichten
90
En weer zitten we met een probleem waar ik als newby in vb2010 express niet uit kom ondanks enkelen dagen van zoekwerk. nl.

Ik wil enkelen grafieken maken waarvan de maatstaf van de grafiek afhankelijk is van de maximale waarde
hierdoor bereik ik naar mijns inzien een redelijke overzicht in een grafiek
Nl. dat de waarde de randen niet overschrijden en/of de waardes niet een te klein oppervlakte beslaan.

Code:
Imports System.IO
Imports System.Data
Imports System.Drawing.Pen
Module Module1
    Private pictureBox5 As New PictureBox()
    Dim alpha(200) As Double
    Dim CL(200) As Double
    Dim CD(200) As Double
    Dim CDp(200) As Double
    Dim CM(200) As Double
    Dim Top_xtr(200) As Double
    Dim Bot_xtr(200) As Double
    Dim x(200) As Double
    Dim Y(200) As Double
    Dim gain As Double
    Dim aantal As Integer
    Dim RE(10) As Integer
    Dim pad As String

    Sub Mod1(strnaam() As String, aantal As Integer)

        Dim j As Integer
        Dim KL As New Pen(Brushes.Red)
        Dim XR As Single
        Dim YR As Single
        Dim xgain As Integer
        Dim Ygain As Integer
        Dim x1 As Integer
        Dim y1 As Integer
        Dim x2 As Integer
        Dim y2 As Integer
        Dim cnt As Integer
        Dim naam As String = ""
        Dim line As String = ""
        Dim CLmax As Double = 0
        Dim Cdmax As Double = 0
        Dim sr As StreamReader  'declaration of filestream to open file 
        Dim fs As FileStream  'clearing listbox data toavoid confusion 



        cnt = 0
        Dim image1 As New Bitmap(600, 1000)
        Dim g As Graphics = Graphics.FromImage(image1)
        g.DrawImage(image1, New Point(0, 0))
        fs = New FileStream(("D:\visual studio 2010\RES\") & strnaam(1), FileMode.OpenOrCreate)            'file inlezen
        sr = New StreamReader(fs)
        For j = 1 To aantal
            line = sr.ReadLine
            naam = sr.ReadLine
            line = sr.ReadLine
            line = sr.ReadLine
            line = sr.ReadLine

            Do Until sr.EndOfStream
                cnt = cnt + 1
                Dim testarray() As String = Split(sr.ReadLine, " ")
                Dim LastNonEmpty As Integer = -1
                For k = 0 To testarray.Length - 1
                    If testarray(k) <> "" Then
                        LastNonEmpty += 1
                        testarray(LastNonEmpty) = testarray(k)
                    End If
                Next
                CL(cnt) = Val(testarray(1))
                CD(cnt) = Val(testarray(2))
                If CD(cnt) > Cdmax Then Cdmax = CD(cnt)
                If CL(cnt) > CLmax Then CLmax = CL(cnt)
            Loop
        Next j
        fs.Close()

        CLmax = 1.845  'TEST WAARDE
        CDmax = 0.083

        With Form1.PictureBox1
            Select Case CLmax
                Case Is < 1.5
                    Select Case Cdmax
                        Case Is < 0.05
                            .Image = New System.Drawing.Bitmap("D:\visual studio 2010\bitmap1-10.bmp")

                        Case 0.05 To 0.1
                            .Image = New System.Drawing.Bitmap("D:\visual studio 2010\bitmap1-11.bmp")

                        Case 0.1 To 0.15
                            .Image = New System.Drawing.Bitmap("D:\visual studio 2010\bitmap1-13.bmp")

                        Case Is >= 0.15
                            .Image = New System.Drawing.Bitmap("D:\visual studio 2010\bitmap1-12.bmp")
                            ' Exit Select
                    End Select
                Case Is >= 1.5
                    Select Case Cdmax
                        Case Is < 0.15
                            .Image = New System.Drawing.Bitmap("D:\visual studio 2010\bitmap1-21.bmp")
                        Case Is >= 0.15
                            .Image = New System.Drawing.Bitmap("D:\visual studio 2010\bitmap1-22.bmp")
                    End Select
            End Select
        End With

        For j = 1 To aantal
            cnt = 0
            xgain = 4000
            Ygain = 175
            XR = 100
            YR = 275

            If j = 1 Then KL = Pens.Red
            If j = 2 Then KL = Pens.Blue
            If j = 3 Then KL = Pens.Green
            If j = 4 Then KL = Pens.Purple
            If j = 5 Then KL = Pens.Black

            fs = New FileStream(("D:\visual studio 2010\RES\") & strnaam(j), FileMode.OpenOrCreate)
            sr = New StreamReader(fs)

            line = sr.ReadLine
            naam = sr.ReadLine
            line = sr.ReadLine
            line = sr.ReadLine
            line = sr.ReadLine
            Do Until sr.EndOfStream
                cnt = cnt + 1
                Dim testarray() As String = Split(sr.ReadLine, " ")
                Dim LastNonEmpty As Integer = -1
                For k = 0 To testarray.Length - 1
                    If testarray(k) <> "" Then
                        LastNonEmpty += 1
                        testarray(LastNonEmpty) = testarray(k)
                    End If
                Next
                CL(cnt) = Val(testarray(1))
                CD(cnt) = Val(testarray(2))
                If cnt <> 1 Then
                    x1 = XR + CD(cnt - 1) * xgain
                    y1 = YR - CL(cnt - 1) * Ygain
                    x2 = XR + CD(cnt) * xgain
                    y2 = YR - CL(cnt) * Ygain
                    g.DrawLine(KL, x1, y1, x2, y2)
                End If
            Loop
        Next
        fs.Close()

        Dim image3 As New Bitmap(600, 1000)
        Dim gr As Graphics = Graphics.FromImage(image3)
        gr.Dispose()
        gr = Nothing
        Form1.PictureBox1.Image = image3
    End Sub
End Module
de bitmap.images worden in een zijn transparent bitmap verwerkt tot dat alles in een picturebox wordt gepresenteer.
Dit moet een grafiek opleveren met verschillende rasters afhankelijk van de max.waarden.
de 5 lijne hebben verschillende kleuren
maar helaas tot op heden kan ik slecht enkelen proefstukjes aan de praat krijgen maar niet het geheel
of het werkt niet (zoals nu) of ik krijgt enkelen fout meldingen
wie kan mij helpen. gr jan
 
probleem gedeeltelijk opgelost
het probleem spits zich toe op /of rond het transparent van de image's
Code:
                          blah...blah...
                            .Image = New System.Drawing.Bitmap("D:\visual studio 2010\bitmap1-21.bmp")
                        Case Is >= 0.15
                            .Image = New System.Drawing.Bitmap("D:\visual studio 2010\bitmap1-22.bmp")
                    End Select
            End Select
        End With
            
             dim img2 as new bitmap(600,430)
             dim g as graphics.fromimage(img2)

"deze regel daar draait het om"
               ' img2.maketransparent(img2.getpixel(600,430))

               fs.close
               sr.close

        For j = 1 To aantal
            cnt = 0
            xgain = 4000
        blah...blah..

Als ik die regel laat staan dan krijg ik wel het raster te zien maar tijdens debuggen merkt ik ook dat hij op dit punt er uit stap.
dus ook geen enkele kans dat de rest van de code doorlopen wordt

maar blokkeer ik deze regel zodat deze niet gelezen wordt dan heb ik wel de grafieken , maar geen raster,dus heb geen idee wat het voorsteld
dus of het een of het ander
is de een niet transparant of is de volgorde van stapelen niet goed'.
ra ra ??? wie verteld mij de waarheid
 
Wat is precies de exception die je krijgt? (toevallig een ArgumentOutOfRangeException?)

Kun je niet gewoon een raster 'drawen' ipv met externe files te werken? Lijkt me nogal omslachtig.

Misschien een compact voorbeeld maken zodat je het gemakkelijk kan testen en eventueel voor hulp kunt uploaden?
 
Laatst bewerkt:
Hallo Bloodshed
Sorry maar ik krijg helemaal geen foutmelding.
De regel loop met het debuggen tot op de regel " img2.maketransparent(img2.getpixel(600,430))" en
daar stop het en geeft direct de form1 met picturebox.
het getoonde plaatje is het raster geselecteerd door Clmax alles volgens wens.
behalve dat de grafieken te zien zijn (en dan gedoel ik zonder de curve lijnen dus )
Haal ik deze regel uit het programma ,dan is het net andersom wel de curve lijnen maar geen raster.
deze weergaven van de polaren omslaat nog een tien tal bitmaps als achtergrond
tot zover de uitleg.
Sorry maar in vB2010 express ben ik een leek (na tien tale jaren VB6) daardoor weet ik niet wat je met "drawen" bedoeld.
het voorbeeld programma is al een verkorte uitgaven, om te testen.
maar ik zal kijken of ik het nog duidelijker kan krijgen door verder inkorten.
groeten en dank voor je aandacht jan.
 
Met 'drawen' bedoelde ik gewoon de het raster tekenen met de graphics class (graphics.DrawLine), lijkt me een stuk fijner dan met plaatjes een raster invoegen.
Kun je eens een plaatje toevoegen wat je precies wilt hebben (het uiteindelijke resultaat) , kan ik een idee krijgen of ik wel goed denk wat het moet worden. (misschien begrijp ik het anders :P )

Het is soms lastig een lap code te ontcijferen, helemaal wanneer ik het niet kan na maken omdat er met externe plaatjes wordt gewerkt.
(ik doe zelf niets met VB maar C#, maar aangezien er niemand had gereageerd dacht ik eens kijken of ik kan helpen)
 
hallo Bloodshed
Ok wat met 'drawen' wordt bedoeld.
ik heb juist voor een bitmap tekening gekozen omdat de tekeningen voor het raster nogal ingewikkeld zijn
Behalve de lijnen van het raster staan er ook nog waardes bij de lijnen zoals de nullijn en de rest van de waardes
zal kijken of ik een tekening kan bijvoegen (heb dat nog nooit gedaan binnen dit medium)
ik kan geen Bitmap.BMP bijvoegen, moet kijken of ik ze om kan zetten "jpg" of een ander Format

verder begrijp ik dat de codes moeilijk te volgen zijn
maar ik waardeer je hulp zeer. ondanks de anderen syntachs
het probleem spits zich toe op het transparent maken van de Bitmap plaatjes en dan speciaal diegene die eerst via clmax lopen
de code "dim image1 as new Bitmap("D:\visual studio 2010\bitmap1-10.bmp")" mag nl niet in een select case worden opgenomen.
anders is het afgeschermd van de rest van de code's
 
Is het zoiets als dit?
Snel iets in elkaar gezet, als voorbeeld als je in zoiets als dit wat tijd zou steken is het vele malen krachtiger en makkelijker te gebruiken dan met plaatjes. (zelfs door de gebruiker te schalen)

(heb maar niet de waardes erin gezet, kan een lijn zijn, of een balk etc)
erlxu0.png
 
hallo bloodshed
Bij mij staan de waardes zowel horizontaal als verticaal bij geschreven dan een echt raster met tekst er bij
met daarin een grafiek van een aantal uitkomsten van een berekening
maar het lijk er erg op jouw voorbeeld.

vraagje hoe Heb je deze tekeningen er bij gezet?

Verder heb ik een oplossing gevonden waardoor het naar wens werkt.
Het probleem zat in de selectie van de Bitmap's voor image1
Ik heb nu de selectie anders verwoordt
de transparentie aangepast en ziedaar........het werkt
Code:
  blah.....blah....
         Select Case Cdmax
                    Case Is < 0.15
                        extension = "Bitmap1-21.BMP"

                    Case Is >= 0.15
                        extension = "Bitmap1-22.BMP"

                End Select
        End Select

        BMstr = "D:\visual studio 2010\" & extension
        Dim Image1 As New Bitmap(BMstr)
        Image1.MakeTransparent()
blah....blah.....
        Dim Image3 As New Bitmap(600, 430)
        Dim gr As Graphics = Graphics.FromImage(Image3)
        gr.DrawImage(Image1, New Point(0, 0))
        gr.DrawImage(Image2, New Point(0, 0))
        gr.Dispose()
        gr = Nothing
        Form1.PictureBox1.Image = Image3

        Image3 = Nothing
        fs.Close()
        sr.Close()
    End Sub
End Module
 
Je kunt gewoon een afbeelding uploaden ergens (bv tinypic.com / imageshack.us) en dan [ IMG ] http:link here [/ IMG ] gebruiken.

De grafiekjes in mijn voorbeeld waren dan ook niet af, omdat het gisteren al laat was :P maar waardes toewijzen zal uiteraard mogelijk zijn.
De streepjes op de Y-as worden door een loopje erin gezet, daar kan tegelijk dus een waarde bij worden geschreven, alles is gedaan met graphics, het zijn geen labels of zo.

Ik zal eens kijken of ik in 't weekend een voorbeeld control in elkaar kan zetten, dit testje was gewoon een panel waar ik het OnPaint event gebruikte om te tekenen.

Maar goed dat je het in iedergeval alvast hebt opgelost.
(ik zou toch zeker nog dat voorbeeld (afbeelding) willen zien :P )
 
hallo bloodshed
Ok dat is zeker een verbetering t.a.v. hoe ik in vb-6 deze bitmap raster heb moeten opbouwen
maar goed ik had ze nog,en waarom zou ik er geen gebruik van maken soms ben ik erg lui.
ach nee maar dan zou ik de graphics eerst weer moeten uitzoeken en vb2010 is voor mij een hele omschakeling




heb nu weer een klein probleemtje ergens wordt het file vast gehouden terwijl ik denk alles te hebben afgesloten komt
er een fout melding " Kan geen toegang krijgen tot het bestand D:\visual studio 2010\RES\HN350.100 omdat het wordt gebruikt door een ander proces."
dit als ik een ander grafiek wilt laten zien
 
Bedank voor de voorbeelden, ik ben een beetje aan het klungelen met een contol. Dit is het tot nu toe:

i3ynpv.png


Kunt al een aantal dingen instellen in de designer, labels worden automatisch bijgescheven bij de 'largeintersections'. Hij 'scaled' mee als de gebruiker de grafiek groter of kleiner maakt.

Nu nog even kijken hoe ik de data ga beheren die in de grafiek moet. :P
 
hallo Bloodshed
ik vind het reuzen interessant maar ik schuif het maar door naar de toekomst eerst even het geheel overschrijven van VB-6 naar VB2010 en dat het werkt
en dan moeten we nog opschieten ,want de volgende upgread staat al weer voor de deur.
moet nog een groot gedeelte omwerken van Fortran naar vb-6 en dan naar Vb2010 of een groot gedeelte ik dacht dat het 'C' is en dan naar 'C-net' de koppeling met vb2010 maken
ook niet eenvoudig.
gr jan
 
Geen probleem, ik maak van 't weekend het gewoon af voor mijzelf dan denk ik :D
Goede oefening, heb nog nooit een graph control gemaakt.

(als iemand anders interesse heeft in dit control kan deze persoon nog wel reageren of mij een mail sturen)
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan