Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Bild malen und speichern VB 6 bzw. .NET

Empfohlene Antworten

Veröffentlicht

Hallo,

wie ist es mir möglich unter Visual Basic 6 bzw. .NET ein Bild zu malen und dieses dann in einer abzuspeichern?

Gruß Tapeman

Ungefähr so:


Option Explicit

Public boolZeichne As Boolean

'Objekte:   Picture1 as PictureBox

'           Menu 'mmPaint' mit zwei Items 'mmPaintBeenden' und 'mmPaintSpeichern'


Private Sub Form_Load()

'Anmerkung: AutoRedraw der PictureBox auf 'True' setzen

    boolZeichne = False

End Sub


Private Sub mmPaintBeenden_Click()

    If MsgBox("Wollen Sie Paint wirklich beenden?", vbYesNo, "Warnung") = vbYes Then

        Unload Me

        End

    End If

End Sub


Private Sub mmPaintSpeichern_Click()

    'Picture1.Picture = Picture1.Image

    SavePicture Picture1.Image, "c:\test.bmp"

End Sub


Private Sub Picture1_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)

    boolZeichne = True

End Sub


Private Sub Picture1_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)

    If boolZeichne Then Picture1.PSet (X, Y)

End Sub


Private Sub Picture1_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single)

    boolZeichne = False

End Sub

Das ist aber für VB6?

Wo bzw. wird der Farbwert festgelegt?

Ja, es ist für VB6.


Option Explicit

Public boolZeichne As Boolean

Public lngFarbe As Long

'Objekte:   Picture1 as PictureBox

'           CommonDialog CommonDialog1

'           Menu 'mmPaint'

'           MenuItem 'mmPaintFarbeSetzen'

'           MenuItem 'mmPaintBeenden'

'           MenuItem 'mmPaintSpeichern'


Private Sub Form_Load()

'Anmerkung: AutoRedraw der PictureBox auf 'True' setzen

    boolZeichne = False

    lngFarbe = 0

End Sub


Private Sub mmPaintBeenden_Click()

    If MsgBox("Wollen Sie Paint wirklich beenden?", vbYesNo, "Warnung") = vbYes Then

        Unload Me

        End

    End If

End Sub


Private Sub mmPaintFarbeSetzen_Click()

    CommonDialog1.ShowColor

    lngFarbe = CommonDialog1.Color

End Sub


Private Sub mmPaintSpeichern_Click()

    'Picture1.Picture = Picture1.Image

    SavePicture Picture1.Image, "c:\test.bmp"

End Sub


Private Sub Picture1_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)

    boolZeichne = True

End Sub


Private Sub Picture1_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)

    If boolZeichne Then Picture1.PSet (X, Y), lngFarbe

End Sub


Private Sub Picture1_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single)

    boolZeichne = False

End Sub

Achja, regelt die Picture die Bildgröße (Pixel mal Pixel) selber, oder geht das irgendwo einzustellen?

Da ich auf Arbeit kein VB6 sondern nur VB.NET habe werde ich es heute nach Arbeitsschluß ausprobieren.

Danke.

Müsstest Du schon selber machen:


'ScaleMode des Picture1 auf 3 - Pixel stellen

'intHeight und intWidth sind Variablen, die man selber setzen soll

Picture1.Height = intHeight

Picture1.Width = intWidth

Habe es ausprobiert:

zur Größe: ScaleHeight muß < sein als Height und ScaleWidth muß < kleiner sein als Width

Ich kann zwar toll Bilder malen, aber der Zugriff dauert ewig lange, kann man das nicht beschleunigen?

Wenn ich ScaleHeight/Width auf über 4095 stelle kommt mir zu Schluß der tolle Fehler, kann AutoRedraw nicht erzeugen. Wahrscheinlich ist das Bild dann mit 4096*4096*3 Byte (48MB) zu groß.

Mir ist es doch lieber manuell einer BMP-Datei zu erzeugen, geht schneller, und kann auch bestimmt größer sein.

Habe es ausprobiert:

zur Größe: ScaleHeight muß < sein als Height und ScaleWidth muß < kleiner sein als Width

Ich kann zwar toll Bilder malen, aber der Zugriff dauert ewig lange, kann man das nicht beschleunigen?

Zugriff auf was? Bei mir geht das Erstellen, Speichern und Ansehen problemlos. VB6 + 1GB RAM

Wenn ich ScaleHeight/Width auf über 4095 stelle kommt mir zu Schluß der tolle Fehler, kann AutoRedraw nicht erzeugen. Wahrscheinlich ist das Bild dann mit 4096*4096*3 Byte (48MB) zu groß.

Mir ist es doch lieber manuell einer BMP-Datei zu erzeugen, geht schneller, und kann auch bestimmt größer sein.

Das Problem mit ScaleHeight/Width kann ich bei mir nicht reproduzieren. Habe beide Werte auf 5000 gestellt, konnte das Bild ohne Probleme malen/speichern/ansehen. Meine Bilder in der Auflösung 15.000 x 15.000 Twips waren unter 3 MB groß.

VB6+512 MB RAM.

Aus Gründen der Zeit und der Graphik schreibe ich die Daten in ein Feld, geht relativ schnell.

Danach werden die Daten mit Picture1.PSet(x,y),c in die PictureBox reingeschrieben; das dauert lange (2 bis 4 fache als das Feld ins Feld schreiben).

Speichern, nagut 48 MB. Kein Problem.

Wenn ich die Größen über das Eigenschaftenfenster setze, nervt mich VB6 mit diesem Verhältnis. (ScaleHeight < Height, ...)

Ein Twip ist kleiner als ein Pixel.

VB6 rechnet dan glaube mehrere Twips zu einem Pixel um.

Poste mal Deinen Quellcode wenn Du kannst, dann kann man am besten die möglichen Engstellen sehen.

So ungefähr:


DIM f(-2048 to 2047, -2048 to 2047) as LONG

DIM a as long, b as long, a1 as long, b1 as long

Berechnen der Farbwerte:

for a=...

 for b=...

      f(a1,b1)=....

 next b

next a

Malen:

for a=-2048 to 2047

 for b=-2048 to 2047

      Picture1.Pset (a,,f(a,

 next b

 if a mod 64=0 then debug.print a

next a

[/code]

Für a=-2048 to 2047 werden rund 2 Minuten gebraucht.

Zu Height, Width ...

Im Programm kann ich Height und ScaleHeigt, ... voneinander unabhängig definieren, aber die Bilddatei hat die Größe Width x Height und nicht ScaleWidth x ScaleHeight, und wenn Width bzw. Height zu groß werden, dann Probleme mit Autoredraw.

[...]

Für a=-2048 to 2047 werden rund 2 Minuten gebraucht.

[...]

Klar, Du befüllst ja auch zuerst Arrays um sie dann in das Bild "hinein" zu malen. Bei der anderen Lösung werden die Pixel direkt in das Bild gemalt.

[...]

Im Programm kann ich Height und ScaleHeigt, ... voneinander unabhängig definieren, aber die Bilddatei hat die Größe Width x Height und nicht ScaleWidth x ScaleHeight, und wenn Width bzw. Height zu groß werden, dann Probleme mit Autoredraw.

[...]

Die Größe des Bildes wird mit Height und Width definiert. ScaleHeight / ScaleWidth ist die "innere" Auflösung des Bildes. Vergleich Drucker - "Height & Width" = DINA4, "ScaleHeight & ScaleWidth" = 300/600/... dpi.

Es geht um den Schreibvorgang selber.

Wenn ich berechne und sofort reinschreibe dauert das noch länger (ich schätze ca. 3,5 min.)

Berechnen: 1,75 Minuten.

Schreiben: 2,5 Minuten.

Wenn aber Height und Width kleiner sind als ScaleHeight und ScaleWidth, dann leider aber die Qualität auch (, extrem).

Aber trotzdem ich will 100%ige Qualität in der Datei.

Wenn die Datei 200 MB oder mehr größer wird ist das egal.

Aber es kommt ja ein AutoRedraw-Fehler.

Eine kleine Relationstabelle:

x 4096 16384

y 4096 16384

-------------------------------

t(berechnen) 1,75 rund 28 Minuten

t(malen) 2,5 rund 40 Minten

-------------------------------------------

Dateigröße 48 MB 768 MB

Wenn ich das berechnete Feld gleich schreibe, dann brauche ich rund 2 Minuten.

Wenn ich in einem Zug berechnen, male und schreibe brauche ich bestimmt 3,5 Minuten.

Archiv

Dieses Thema wurde archiviert und kann nicht mehr beantwortet werden.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.