Sehr geehrte Damen und Herrn,
ich bin Student an der Uni Bochum Fachbereich Elektrotechnik und ich heiße Fernando.
Ich mache meine Projektarbeit in Visual Basic und ich muss viel damit arbeiten.
Deswegen habe ich einige Verständnisfragen dazu.
Wer kann mir dabei helfen und meine einige Fragen in Visual Basic beantworten?
Wenn einer mir dabei helfen kann, bin ich sehr dankbar dafür.
Meine e-Mail Adresse ist:
fernando.fransis@yahoo.de
Mit freundlichen Grüßen
Fernando Fransis
Programmieren - alles kontrollieren 4.941 Themen, 20.708 Beiträge
Hi!
Hey, nicht so förmlich und geheimnisvoll tun! ;-)
Zum Fragen ist dieses Forum und vorallem das Programmierbrett da, also raus mit den Fragen! :-)
Bis dann
Andreas
Hi Andreas,
vielen Dank für dein Interesse.
Also schicke ich dir die Anhängen auf deine folgende e-Mail Adresse?
rubdoob@web.de
damit ich dir die Fragen erklären kann.
Fernando
Wie lauten denn die Fragen?
Hallo T-Rex,
vielen Dank für dein Interesse und dein Versuch, mir zu helfen.
Bitte kannst du mir deine e-Mail Adresse schreiben, damit ich dir die Aufgabe (als Anhang) und die Erklärung dazu senden kann.
Meine e-Mail Adresse ist:
fernando.fransis@yahoo.de
schönste Grüße
Fernando
Nein. Stelle Deine Fragen einfach hier.
ja, und der Anhang?
Also kannst du selbst mir nicht dabei helfen?
Ich kann die Frage da stellen, aber ohne den Anhang kann man gar nichts verstehen!
Deswegen wenn man seine Hilfe mir anbietet, dann sende ich ihm den Anhang per e-Mail, wie ich es zu dir gesendet habe.
Also noch mal hast du per deine e-Mail nicht gemeint, dass du selbst mir helfen kannst, sondern hier meine zu stellen, um die anderen lesen zu können?
... stell den Anhang doch irgendwo im Netz als Download bereit. Falls Du bereits ein eMail-Konto bei GMX hast könntest Du deren Media-Center benutzen (da kann man Ordner für andere User freigeben lassen, lass Dir einfach selbst eine eMail mit dem Zugriffslink senden und dann veröffentliche den hier - dann kann jeder der helfen möchte sich das ganze runterladen, _ohne_ daß er seine eMail-Addy für sowas veröffentlichen muß)...
Hi!
Wenn du zustimmst, stelle ich den Quelltext hier rein.
Für alle Mitleser: ich hab' sein Problem schon etwas im Detail beschrieben, es geht primär um Probleme beim Erzeugen eines Bildes (betrifft die Höhe und Breite).
Bis dann
Andreas
Solange ich die Fragen nicht kenne, kann ich Dir nicht helfen. Beruflich arbeite ich die meiste Zeit mit VB6.
Ok,
also bitte kannst du mir deine e-Mail Adresse schreiben, damit ich dir die Aufgabe und die Erklärung dazu senden kann.
Weil ich zusätzlich zu Fragen mein bis jetzt bearbeitetes Programm per e-Mail als Anhang senden muss, damit die Frage verständlich sei.
Also noch mal bitte send mir deine e-Mail Adresse!!
Du kannst sie einfach auf meine folgende e-Mail Adresse senden:
fernando.fransis@yahoo.de
beste Grüße
Fernando
Ich habe noch nie jemanden gesehen, der mit so viel Vehemenz angebotene Hilfe ausschlägt. Warum postet Du Deine Fragen nicht hier?
Investiere die Zeit für eine ausführliche Beschreibung und stelle die Fragen dazu!
Ok,
wenn du so willst, dann mache ich es.
Ich stelle die Frage hier, aber wie ich dir gesagt habe, es ist unmöglich, meine Frage zu verstehen, ohne die bearbeitenden Bilder und mein bisheriges geschriebenes Programm zu sehen.
Wenn du mir nicht deine offizielle e-Mail Adresse geben willst, kannst du irgendwelche andere mir geben, die du lesen kannst.
Aber wie du es willst, schreibe ich dir hier meine Frage.
Meine Frage folgt es so:
Wenn ich das Projekt öffne und das Bild A lade, öffnet Bild A in kleinem Quadrat durch Scroll-Bar. Das ist ganz in Ordnung. Weil das echte Bild A größer als dieses Quadrat ist, aber durch Scroll-Bar wird es gelöst.
Aber das gebliebene Problem ist, nachdem ich Bild B durch Bild A erzeuge,
wird nur das Teil des kleine Quadrats von BildB erzeugt und erscheint und nicht das gesamte Bild.
Deswegen muss ich das gesmate BildB von BildA in diesem kleinen Quadrat erzeugen,
und durch Scroll-Bar das gesamte BildB verschieben, genauso wie ich bei BildA gemacht habe.
Bild A war das Bild zu bearbeiten und Bild B habe ich durch das Programm erzeugt.
Bild B war das erzeugte Bild von Bild A durch RGB und durch das Programm, das ich geschrieben habe und per e-Mail dir senden "würde".
herzliche Grüße
Fernando
Wenn die Frage gut gestellt ist, braucht man die bearbeiteten Bilder und das Projekt nicht sehen.
kleinem Quadrat durch Scroll-Bar.
Um welches Steuerelement handelt es sich dabei?
Weil das echte Bild A größer als dieses Quadrat ist
Welche Dimensionen hat das Bild, welche das Steuerelement?
nachdem ich Bild B durch Bild A erzeuge,
Was genau machst Du mit Bild A, um Bild B zu erzeugen?
Hi!
Ich fühle mich irgendwie ignorier - keiner hört auf mich...
Auszüge aus dem Quelltext (ich denke, jetzt darf ich einfach):
Hier wird das Bild1 deklariert:
Begin VB.Frame Frame1
BorderStyle = 0 'None
Caption = "Frame1"
Height = 2600
Left = 300
TabIndex = 0
Top = 240
Width = 4100
Begin VB.PictureBox Picture1
BackColor = &H00FFFFFF&
BorderStyle = 0 'None
Height = 2500
Left = 0
ScaleHeight = 167
ScaleMode = 3 'Pixel
ScaleWidth = 267
TabIndex = 1
Top = 0
Width = 4000
End
End
Das ist für Bild2:
Begin VB.PictureBox Picture2
AutoRedraw = -1 'True
Height = 2500
Left = 480
ScaleHeight = 163
ScaleMode = 3 'Pixel
ScaleWidth = 263
TabIndex = 16
Top = 3840
Width = 4000
End
So erfolgt das Laden von Bild1:
Private Sub Öffnen_Click()
Picture1.Visible = True
dlgPicture.ShowOpen
file_num = FreeFile
Open dlgPicture.FileName For Binary Access Read As #file_num
Set Picture1.Picture = LoadPicture(dlgPicture.FileName)
Picture1.Move 0, 0
VScroll1.Max = Picture1.Height - Frame1.Height
HScroll1.Max = Picture1.Width - Frame1.Width
VScroll1.Value = 0
HScroll1.Value = 0
If Picture1.Height
If Picture1.Width
Exit Sub
VScroll1 und HScroll1 sind Scrollbalken, die mit Picture1 verbunden sind (denke ich).
Das Problem tritt offenbar auf, wenn aus Picture1 das neue Picture2 erzeugt werden soll:
Private Sub Picture2_Erzeugen_Click()
Dim CV1 As ColorValues
Dim CV2 As ColorValues
breite1 = Picture1.ScaleWidth
höhe1 = Picture1.ScaleHeight
breite2 = Picture2.ScaleWidth
höhe2 = Picture2.ScaleHeight
Dim Anzahl As Integer
Anzahl = Txt_Anzahl.Text
For iY1 = 0 To höhe1 - 1
For iX1 = 0 To breite1 - 1
lCol1 = GetPixel(Picture1.hdc, iX1, iY1)
CV1 = fBreakColors(lCol1)
lCol2 = GetPixel(Picture2.hdc, iX2, iY2)
CV2 = fBreakColors(lCol2)
If CV1.iRed
If CV1.iGreen
If CV1.iBlue
SetPixel Picture2.hdc, iX1, iY1, RGB(CV2.iRed, CV2.iGreen, CV2.iBlue)
Next iX1
Next iY1
Picture2.Refresh
End Sub
Wie ich schon versucht habe zu erklären, könnte die Verwendung der Scale-Werte das Problem sein. ist das zufällig die reale Grösse des Objektes auf dem Bildschirm, so dass nicht die komplette Grösse von Picture1 bearbeitet wird? oder arbeitet die Routine nur im sichbaren Fenster?
Es handelt sich offenbar um eine Art "Kontrastverstärkung", die unscharfe Strukturen in Picture1 in Picture2 schärft (durch Manipulation der Farben).
Bis dann
Andreas
Wenn es sich wirklich um das Ändern des Kontrastes handelt, findet sich hier bestimmt etwas:
ActiveVB.de Tipps&Tricks
Das "Open ... For Binary" ist für LoadPicture nicht notwendig.
Hi!
ne, lass seine Behandlung mal stehen, das scheint mir eine Art Fehlerauswertung zu sein - ich hab' soetwas mals elbst erlebt, da ging es um das automatische Zählen von gesunden und deformierten Zellkernen. Hier geht es aber offenbar um materialeinschlüsse doer etwas in der Art. Da muss er dann schon mit seiner Routine arbeiten.
Das Problem scheint eher ein Handlingproblem zu sein: er muss will offenbar das Picture2 punktweise aus Picture1 erzeugen (die Punkte werden ind en For-Schleifen gelesen, modifiziert und übertragen. ich vermute, dass seine Routine nur das sichtbare Fenster, also den sichbaren bereich von Picture1 abarbeitet. daher muss er das Bild dann über die Scrollbalken verschieben und die Bearbeitugn neu anstossen (nachdem er Picture2 entsprechend verschoben hat).
Er sucht nun einen Weg, Picture1 komplett zu bearbeiten. Ist das denn über so über Picturebox und GetPixel machbar?
Mein "VB6 - Kompentium" enthält diese Klassen noch nichtmal im Schlagwortverzeichnis und ich hab' kein VB6 installiert. Ah - gerade entdeckt, dass läuft unter dem Objekt Bitmap.
Ich hab' mich jetzt nicht komplett eingelesen, aber ich denke, das Problem besteht darin auf den nichtsichtbaren Teil einer Bitmap zuzugreifen und von dort einen Pixel zu lesen und wieder zu setzen.
Ein Lösungsansatz ist klar: wenn ich die Bitmap mit den Scrollbalken verschieben kann, dann kann ich das auch über das Programm erledigen. Also sichbaren Berich scannen, wie bisher, dann verschieben und neu scannen...
Bis dann
Andreas
Ich glaube, das hat so keinen Zweck, hier im Thread stehen viel zu wenig Informationen, um das Problem zu verstehen und eine Lösung zu finden. Ich bin jetzt also Fernandos Wunsch nachgekommen.
Hi!
Das ist jetzt ein völliges Mistverständnis: du sollst deine Fragen hier im Forum stellen und nicht an mich senden. ;-)
Ich selbst habe nicht so viel Erfahrung mit VB, dass ich bei jedem Problem helfen kann, es lesen aber hier genügend erfahrene VB-Programmierer mit, die dann helfen können.
falls du grössere Bilder oder soetwas für Erklärungen hast, dann wäre es sinnvoll, diese im Internet auf einer Downloadmöglichkeit abzulegen, so dass sie sich jeder, der daran interesse hat herunterladen kann.
Bis dann
Andreas
Hi!
Ich hab' gerade bemerkt, dass du die Mail schon an mich gesendet hast.
Ich ebantworte die Fragen einfach hier:
Die Adresse notify@nickles.de ist natürlich nicht meine Adresse und du hast diese Mail auch nicht von mir bekommen. Das ist eine von Nickles.de automatisch erzeugte Mail, die dich informiert hat, dass ich eine Antwort an deine Frage gehängt habe ("notify" bedeutet hier Benachrichtigen).
Ich habe im Moment auf keinem meiner Rechner ein VB6.0 installiert, so dass ich das mitgesendete Projekt nicht starten kann, ich hätte zum schnellen Testen also eine EXE-Datei benötigt.
OK, wenn ich das richtig verstehe (ich orientiere mich an Form1.frm, die den Quelltext enthält) hast du eine Form mit zwei Pictureboxes (zur Anzeige von BMP-Dateien) Picture1 und Pictire2 und diverse Buttons und Eingabefelder.
Wennn du nun ein Bild in Picture1 lädst, dass vorhanden ist, dann kann das grösser sein als die Picturebox und man kann das Bild über Scrollbalken verschieben.
Jetzt möchtest du zusätzlich auf Knopfdruck ein neues Bild in der Picture2 erzeugen. Das wird dann über einen zweiten Button gespeichert. Dabei scheinst du die Abmessung (Punkteanzahl in Höhe und Breite) aus Picture1 zu übernehmen.
Das eigentliche Problem ist jetzt, dass du keine Bilder erzeugen kannst, die grösser sind als die Picturebox.
Ich hab' (wie gesagt) kein VB6.0 da und kann deshalb nicht in die Onlinehilfe schauen. Du nutzt bei Picture1 die Werte ScaleHeight und ScaleWidth um die Höhe und Breite zu erhalten, die in Picture2 bearbeitet werden (da laufen FOR-Schleifen von 0 bis Picture1.ScaleHeight -1 (dito für die Breite).
Kann es sein, dass man über ScaleHeight und ScaleWidth nur die aktuelle Anzeigehöhe und Breite ausliest und das die echte Bildhöhe und Breite in Picture1.Height und Picture1.Width steht?
Hmm, etwas vergleichbares habe ich noch nie programmiert. Deshalb hab' ich auch keine sofortige Lösung parat.
Bis dann
Andreas
Hallo wieder Andreas,
nachdem du angeboten hast, mir zu helfen, habe ich dir gestern die Aufgabe und die Erklärung dazu 2 mal gesendet.
Erstes Mal auf die e-Mail Adresse: rubdoob@web.de und zweites Mal auf: notify@nickles.de
Weil ich es nicht weiße, welche davon deine e-Mail Adresse ist.
Wenn du die Aufgabe und die Erklärung dazu gekriegst hast, bitte gib mir Bescheid. Sonst kannst du mir bitte deine richtige e-Mail Adresse geben, damit ich es dir wieder senden kann.
Noch mal vielen Dank für dein Interesse und dein Versuch mir zu helfen.
Fernando
Hi!
Ich hatte vor deiner Rückmeldung, noch eine zweite Antwort angefügt: Link
Bis dann
Andreas
Das Problem ist ganz einfach. Zitat aus der MSDN Library:
The pixel must be within the boundaries of the current clipping region.
Das Pixel darf also nicht verdeckt werden, wenn man es auslesen möchte.
Da ich mich mit Grafik nicht auskenne, kann ich Dir nur raten, das Bild vor dem Berechnen vollständig anzuzeigen. Nach dem Berechnen kannst Du es ja wieder in seine Grenzen verweisen.
Hier mal eine leicht abgewandelte Sub:
Private Sub Picture2_Erzeugen_Click()
' Schwellwert auslesen
Dim Anzahl As Long
Anzahl = CLng(Txt_Anzahl.Text)
Dim Breite1 As Long
Dim Höhe1 As Long
Dim lCol1 As Long
Dim CV1 As ColorValues
Breite1 = Picture1.Picture.Width \ Screen.TwipsPerPixelX
Höhe1 = Picture1.Picture.Height \ Screen.TwipsPerPixelX
' Picture2 auf die richtige Größe bringen
With Picture2
.BorderStyle = 0
.ScaleMode = ScaleModeConstants.vbPixels
.Width = Picture1.Width
.Height = Picture1.Height
.AutoRedraw = True
.BackColor = vbWhite
Call .Cls
Set .Picture = Picture1.Picture
.Visible = False
End With
For iY1 = 0 To Höhe1 - 1
For iX1 = 0 To Breite1 - 1
' Farbwert auslesen und aufbrechen
lCol1 = GetPixel(Picture2.hdc, iX1, iY1)
CV1 = fBreakColors(lCol1)
If CV1.iRed CV1.iRed = 0
Else
CV1.iRed = 255
End If
If CV1.iGreen CV1.iGreen = 0
Else
CV1.iGreen = 255
End If
If CV1.iBlue CV1.iBlue = 0
Else
CV1.iBlue = 255
End If
' Pixel setzen
SetPixel Picture2.hdc, iX1, iY1, RGB(CV1.iRed, CV1.iGreen, CV1.iBlue)
Next iX1
Next iY1
With Picture2
.Visible = True
Call .Refresh
End With
End Sub