Laden...

Forenbeiträge von Elias1994 Ingesamt 54 Beiträge

06.07.2016 - 11:29 Uhr
data = bitmap.LockBits(new Rectangle(0, 0, bitmap.Width, bitmap.Height), ImageLockMode.ReadOnly | ImageLockMode.UserInputBuffer, bitmap.PixelFormat, data);  

Okay cool. D.h. das Pixelformat kann ich hier in Lockbits angeben?

Z.B.:
Format48bppRgb

data = bitmap.LockBits(new Rectangle(0, 0, bitmap.Width, bitmap.Height), ImageLockMode.ReadOnly | ImageLockMode.UserInputBuffer, PixelFormat.Format48bppRgb);
06.07.2016 - 08:53 Uhr

Es kommt auf das PixelFormat

Super danke. Stimmt daran sieht man sehr gut. Kann man das irgendwo nachlesen, wann welches Pixelformat benutzt wird. Ich weiß, dass ich das Pixelformat abfragen kann. Mich würde, dass nur interessieren, was wo seine Anwendung findet.

Und was mich noch interessieren würde:

Wenn ein Bild ein bestimmtes Pixelformat hat, lässt sich das Bild dann in jedes beliebige andere Pixelformat umwandeln?

05.07.2016 - 16:14 Uhr

Die schnellste Variante wäre in dem Anwendungsfall, das Bild einfach in ein Byte-Array zu konvertieren, und dann die Werte im Array auf die gegebene Toleranz zu prüfen - dadurch kann man komplett auf Bitmap-Operationen verzichten.

Liege ich der Annahme richtig, dass die Bytes nach folgendem Prinzip in das Array geschrieben werden:

  • Die RGB Werte werden beginnend links oben am Bild Zeile für Zeile bis
    einschließlich Bildende (rechts unten) ( also so wie man ein Buch liest 😉 )

  • ´Bytearray[0] =B-Wert des ersten Pixels

  • ´Bytearray[1] =G-Wert des ersten Pixels

  • ´Bytearray[2] =R-Wert des ersten Pixels

  • ´Bytearray[3] =B-Wert des ersten Pixels

  • ´Bytearray[4] =G-Wert des ersten Pixels

  • ´Bytearray[5] =R-Wert des ersten Pixels

Zumindest hat dies meine Analyse des Bytearrays ergeben. Hat mich etwas verwundert, da ich davon ausgegangen war, dass erst die R-Wert des ersten Pixels im Array steht und nicht der B-Wert.

Kann das jemand bestätigen?

Gruß,
Elias

21.06.2016 - 14:48 Uhr

Hallo Cat,

aber wenn du doch sowieso das Video selbst erstellst, dann hast du doch jeden einzelnen Frame als Bitmap vorliegen. Und kannst dann wieder die Pixel überprüfen.

Das ist richtig. Das wäre mir sogar am liebsten. Überlege nur noch wie ich das am besten umsetzte.

Meine Idee wäre dann im newFrameHandler nach jedem Frame.Clone das Bitmap zu speichern. Die einzelnen Bitmaps will ich aus Dokumentationsgründen speichern. Und anschließend das Bild sofort zu analysieren mit meiner Methode VideoToByteArray();

Also so:


        void FinalVideo_NewFrame(object sender, NewFrameEventArgs eventArgs)
        {
            if (stopVideo==false)
            {
                video = (Bitmap)eventArgs.Frame.Clone();
                VideoToByteArray(video);
                video.Save(pathXY);
                FileWriter.WriteVideoFrame(video);
            }
//....
}

Aber habe ich da nicht ein riesen Performanceverlust, wenn ich das alles in den Handler schreibe? Nehmen mir mal an die Methode VideoToByteArray() benötigt 2s dann wird ja auch maximal alle 2s ein neuer Frame gecloned, gespeichert und analysiert.

21.06.2016 - 09:43 Uhr

Hallo nochmal,

habe jetzt etwas Zeit in Recherche gesteckt und folgendes gefunden:

http://stackoverflow.com/questions/17825677/extracting-frames-of-a-avi-file

Dann scheint das richtige zu sein. Sieht hier jemand ein Problem darin?

21.06.2016 - 08:57 Uhr

Um Videos zu analysieren, muß man die einzelnen Frames extrahieren

Mit dem FileWriter erstelle ich ja mein Video aus mehreren Frames/Bitmaps:


void _NewFrame_Video(object sender, NewFrameEventArgs eventArgs)
        {
            video = (Bitmap)eventArgs.Frame.Clone();
            FileWriter.WriteVideoFrame(video);
            VideoToByteArray(video);
        }

Ich finde das irgendwie etwas umtändlich, wenn ich mein fertiges Video dann wieder in Frames zerstückeln muss. Das geht doch bestimmt einfacher alle RGB-Werte aller Pixel aller Frames auszulesen.

13.06.2016 - 15:17 Uhr

Hallo,

wie kann ich strings in einem enum speichern?

Habe z.B.: diese 3 strings:


string a = "webcam";
string b = "framegrabber";
string c ="actioncam";

und die sollen dann einfach in einem enum stehen


enum videoDevices {webcam, framegrabber, actioncam}

VG,
Elias

07.06.2016 - 11:28 Uhr


>

Nicht ganz.

Wenn sowas gehen würde wäre das Ganze einfacher:

if (dropDown_Tested_Device.Value == a || b || c || d ...)
 {//do something
 } 
07.06.2016 - 11:22 Uhr

Was willst du mit dem Enum eigentlich erreichen?

Mit dem Enum wird eine DropdownListe gefüllt (WindowsForms). Der User kann dann einen Eintrag aus der Liste auswählen.

07.06.2016 - 11:09 Uhr

Hallo,

ich suche eine Kurzform für eine if-Abfrage, da mein Code dadurch bisher sehr unleserlich ist. Das muss doch kürzer gehen oder eine andere Strategie geben:


public enum testedConnection{a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z} //enum

if (dropDown_Tested_Device.Value == testedConnection.a || dropDown_Tested_Device.Value == testedConnection.b|| dropDown_Tested_Device.Value == testedConnection.c || dropDown_Tested_Device.Value == testedConnection.d || dropDown_Tested_Device.Value == testedConnection.e || dropDown_Tested_Device.Value == testedConnection.f || dropDown_Tested_Device.Value == testedConnection.g || dropDown_Tested_Device.Value == testedConnection.h|| dropDown_Tested_Device.Value == testedConnection.i|| dropDown_Tested_Device.Value == testedConnection.j|| dropDown_Tested_Device.Value == testedConnection.k || dropDown_Tested_Device.Value == testedConnection.q || dropDown_Tested_Device.Value == testedConnection.r|| dropDown_Tested_Device.Value == testedConnection.s || dropDown_Tested_Device.Value == testedConnection.t || dropDown_Tested_Device.Value == testedConnection.u)
{//do something
}
07.06.2016 - 11:01 Uhr

Die schnellste Variante wäre in dem Anwendungsfall, das Bild einfach in ein Byte-Array zu konvertieren, und dann die Werte im Array auf die gegebene Toleranz zu prüfen - dadurch kann man komplett auf Bitmap-Operationen verzichten

Danke hat wunderbar geklappt und ist vor allem rasend schnell. Funktioniert das Ganze auch für Videos? Also ich möchte überprüfen, ob in dem Video ein Pixel schwarz geworden ist.

Für das Bild:


        public byte[] BitmapToByteArray(Bitmap bitmap)
        {

            BitmapData bmpdata = null;
            try
            {
                bmpdata = bitmap.LockBits(new Rectangle(0, 0, bitmap.Width, bitmap.Height), ImageLockMode.ReadOnly, bitmap.PixelFormat);
                numbytes = bmpdata.Stride * bitmap.Height;
                bytedata = new byte[numbytes];
                IntPtr ptr = bmpdata.Scan0;

                Marshal.Copy(ptr, bytedata, 0, numbytes);

                return bytedata;
            }
            finally
            {
                if (bmpdata != null)
                    bitmap.UnlockBits(bmpdata);
            }

        }
 public void CheckScreenColor()
        {
            for (int counter = 0; counter < numbytes; counter++)
            {
                byte a = bytedata[counter];
                if (bytedata[counter] < farbgrenze)
                {
                    if (counter == 0 || (counter % 3) == 0)
                    {
                        MessageBox.Show("Pixel " + (counter + 1) + " (Value red) is not black.");
                        return;
                    }

                    else if ((counter == 1) || ((counter - 1) % 3) == 0)
                    {
                        MessageBox.Show("Pixel " + (counter + 1) + "(Value yellow) is not black.");
                        return;
                    }

                    else if ((counter == 2) || ((counter - 2) % 3) == 0)
                    {
                        MessageBox.Show("Pixel " + (counter + 1) + " (Value blue) is not black.");
                        return;
                    }

                }
            }
07.06.2016 - 10:51 Uhr

Danke dir. Konnte gelöst werden.

03.06.2016 - 15:31 Uhr

Hallo zusammen,

ich versuche gerade Bitmaps (z.B.: picture1) im Ordner XY (z.B.: Bibliotheken\Bilder) zu speichern und bin dabei auf SaveFile Dialog gestoßen.
Mich stört allerdings, dass dabei der Benutzer immer aufgefordert wird den Button Speichern zu drücken.

Hintergrund: Eine Webcam soll über Nacht 50 Bilder machen und in diesem Ordner abspeichern. Sprich das Ganze soll automatisiert laufen, so dass ich keine Dialogfenster benötige, die mich nach Speicherort, etc fragen.

Gibt es dafür entsprechende Properties, dass die Bilder in einem Ordner abgespeichert werden, den ich hart eincodiere? Außerdem soll wenn das zweite Bilde abgespeichert wird immer kontrolliert werden, ob eine Datei mit dem Namen schon vorhanden ist und nicht überschreiben, sondern den Dateinamen hochzählen:

picture1.bmp
picture1(1).bmp
picture1(2).bmp
...

VG,
Elias

Vielen Dank vorab und bei Unklarheiten einfach nachfragen.

30.05.2016 - 10:08 Uhr

Alles klar danke Latino.

@gfoidl

Für GetPixel und SetPixel hab ich mir angehängte Klasse erstellt -- in Anlehnung an andere Klassen die es dazu gibt (wie die von dir verlinkte).
Schau dir angehängt einmal an, dann siehst du wie das geht. Du kannst du Klasse auch direkt verwenden.

Danke. Deinen Ansatz konnte ich jetzt auch nachvollziehen und habe beide Lösungen nun funktionsfähig.

30.05.2016 - 09:23 Uhr

Moin moin,

das Pixelformat konnte ich inzwischen ermitteln. Bekomme für GDI, Format24bppRgb und DontCare ein true. Mit der FastBitmap.cs bin ich leider nicht ganz zurecht gekommen wie das funktioniert die Pixelwerte abzufragen. Habe mich stattdessen für die Variante von MrSparkle entschieden und das so gelöst:


public byte[] CreateBitmapArray(Bitmap blackBitmap)
        {

               BitmapData bmpdata = blackBitmap.LockBits(new Rectangle(0, 0, blackBitmap.Width, blackBitmap.Height), ImageLockMode.ReadOnly, blackBitmap.PixelFormat);
                anzahlPixel = bmpdata.Stride * blackBitmap.Height;
                dataByte = new byte[anzahlPixel];
                IntPtr intPtr = bmpdata.Scan0;

                Marshal.Copy(intPtr, dataByte, 0, anzahlPixel);

                return dataByte;

                if (bmpdata != null)
                blackBitmap.UnlockBits(bmpdata);
        }


        private void button1_Click(object sender, EventArgs e)
        {
            Bitmap blackscreen = new Bitmap("c:\\blackscreen.bmp");

            BitmapToByteArray(blackscreen);

            for (int x = 0; x < anzahlPixel; x++)
            {
                if (dataByte[x] > 22)
                {
                    MessageBox.Show("Pixel "+x+" is not black");
                    return; // beende die Methode sobald der erste Pixel außerhalb der Toleranz liegt
                }
            }
        }

Trotzdem würde mich auch noch die andere Lösung interessieren ohne das Bild in ein Array umzuwandeln.

25.05.2016 - 12:57 Uhr

Hallo zusammen,

das Thema kam bereits schon öfters auf. Ich habe ein Bild das im Normalfall komplett schwarz ist (R=0, G=0, B=0), wobei die Werte eine gewissen Toleranz haben dürfen (maximal den Wert 22). Mein Bild hat immer einer Größe von 1280x720. Das Pixelformat kenne ich leider nicht. Kann man das herausfinden oder muss man das gar nicht spezifisch angeben?

Um zu überprüfen, ob das Bild wirklich schwarz ist möchte ich von jedem Pixel die RGB-Werte auslesen und mit dem Grenzwert vergleichen. Sobald ein Pixel außerhalb de Toleranz liegt wird die Methode beendet.

Bisher mache ich das ganze mit GetPixel. Das ganze ist bekanntermaßen sehr träge. Habe jetzt auch schon sämtliche Foren durchforscht und versucht mich mit dem Thema Lockbits auseinander zusetzten. Unteranderem auch das Thema GetPixel und SetPixel um Längen geschlagen. 800 mal schneller gelesen und die Klasse BitmapHelper verwendet. Mir ist aber nicht klar wie ich das jetzt für meine bisherige Code verwenden kann. Help me please 😉

private void Check_RGB_values_Click(object sender, EventArgs e)
        {
            int countPixel = 0;
            Bitmap myBitmap = new Bitmap("C:\\blackscreen.bmp");

            for (int x = 0; x < myBitmap.Width; x++) //1280
            {
                for (int y = 0; y < myBitmap.Height; y++) //720
                {
                    countPixel++;
                    Color pixelColor = myBitmap.GetPixel(x, y);

                    string rotAnteil = pixelColor.R.ToString();
                    string gelbAnteil = pixelColor.G.ToString();
                    string blauAnteil = pixelColor.B.ToString();

                    if (pixelColor.R > 22)
                    {
                        MessageBox.Show("Red from pixel No." + countPixel + " is out of range. " + rotAnteil + "> 22");
                        return;
                    }

                    if (pixelColor.G > 22)
                    {
                        MessageBox.Show("Yellow from pixel No." + countPixel + " is out of range. " + gelbAnteil + "> 22");
                        return;
                    }

                    if (pixelColor.B > 22)
                    {
                        MessageBox.Show("Blue from pixel No." + countPixel + " is out of range. " + blauAnteil + "> 22");
                        return;
                    }
                }
            }
        }

Beste Grüße,
Elias

18.05.2016 - 08:38 Uhr

Hallo zusammen,

ich besitze eine GoPro Hero 4 (http://www.redcoon.de/B566443-GOPRO-HERO4-Black-Adventure-DE_Actioncam?isRfa=1&gclid=CK2Rhrn_4swCFQhuGwodkZQPug), die über einen Framegrabber (http://www.epiphan.com/products/dvi2usb-3-0/) an den Rechner angeschlossen werden kann. Der Framegrabber unterstützt Direct Show , so dass ich die Aforge Libaries verwenden kann. Mit der GoPro filme ich verschiedene einfarbige Hintergründe.
Mein Ziel ist es, dass die GoPro einen schwarzen Hintergrund erkennt.

Bisherige Idee:

Einbinden der GoPro bzw. Framegrabbers mit Hilfe der Aforge Libary.

Es wird ein Snapshot ausgelöst und gespeichert. Anschleißend sollen alle Pixel des Bildes mit dem Farbwert schwarz (0 +- Toleranz) verglichen werden..

Befinden ich alle Pixel im Toleranzbereich, soll eine einfache Ausgabe erscheinen: "Blackscreen detected".

Ich habe gelesen, dass man Aforge sehr viel machen und entsprechend Libaries zur Verfügung stehen. Habe mir auch schon ein paar Beispiele angeschaut.

Ich habe aber nur Beispiele gefunden, bei denen das Bild erst in eine pictureBox gelegt wird.

Ich möchte allerdings OHNE Forms auskommen (keine pictureBox etc.) Ist dies dann trotzdem möglich. Wenn ja wie?

VG,
Elias

31.03.2016 - 09:25 Uhr

Es lag tatsächlich daran, dass WriteLine funktioniert und Write nicht.

Was mich allerdings irritiert, weil das Template mit der Write-Methode arbeitet

 this.serialPort.Write(data + Environment.NewLine);

und das auch funktioniert. Verwende ich allerdings bei meinem Code funktioniert nur die WriteLine-Methode.

Woran liegt das?

Gruß,
Elias

30.03.2016 - 18:52 Uhr

Hallo zusammen,

will über den Port COM9 eine Nachricht an ein Display senden, so dass dieses darauf reagiert. Will dafür aber keien Forms Anwendung sondern eine kleinstmögliche Applicationsanwendung.

Einstellungen:

Baud: 115200
Data: 8
Parity: None
Handshake: None
Mode: Free

habe mir einige Projekte angeschaut mit denen das Ganze auch funktioniert und versucht das Ganze auf das Nötigste abzuspecken, aber es funzt nicht. Was habe ich vergessen oder falsch gemacht. Den Port scheint sich zu öffnen, nur er reagiert auf die Nachricht SWITCH_SCREEN ( ist ein CodeWort auf das das Display regieren sollte, tut es ja auch wenn ich mir ein Projekt aus dem Internet lade) nicht:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO.Ports;

namespace COM3_Test
{
    class Program
    {
       static SerialPort port1 = new SerialPort("COM9", 115200, Parity.None, 8, StopBits.One);

        public static void Main(string[] args)
        {
            //port1.PortName = "COM9";
            //port1.BaudRate = 115200;
            //port1.Parity = Parity.None;
            //port1.DataBits = 8;
            //port1.StopBits = StopBits.One;
            //port1.Handshake = Handshake.None;


            port1.Open();
            port1.Write("<SWITCH_ SCREEN,1>");

        }
    }
}
11.03.2016 - 13:31 Uhr

Hallo zusammen,

ich möchte mit folgendem Code meine Combobox füllen. Der Designer spuckt aber leider eine Fehlermeldung aus:

Der Designer kann Code in Zeile 637 nicht ausführen:

 for (uint fillBox12 = 0; fillBox12 <= 65536; fillBox12++)
            {
                if (fillBox12 >= 0 && fillBox12 < 17768)
                {
                    stringArray[fillBox12] = this._comboBox12_.Text = "X=" + fillBox12 + ", Y=0";
                }
                else if (fillBox12 > 17768 && fillBox12 <= 65535)
                {
                    stringArray[fillBox12] = this._comboBox12_.Text = "X=0, " + ", Y=" + fillBox12;
                }
            }

Fehlermeldung:
Der Code in der InitializeComponent-Methode wird von dem Designer erzeugt und darf nicht manuell geändert werden. Entfernen Sie alle vorgenommenen Änderungen, und öffnen Sie den Designer erneut.

Wo muss ich den Code einfügen?

            string[] fillBox12Items = new string[65536];
            

            this._comboBox12_.AccessibleName = "";
            this._comboBox12_.FormattingEnabled = true;

            for (uint fillBox12 = 0; fillBox12 <= 65536; fillBox12++)
            {
                if (fillBox12 >= 0 && fillBox12 < 17768)
                    { stringArray[fillBox12] = this._comboBox12_.Text = "X=" + fillBox12 + ", Y=0"; }

                else if (fillBox12 > 17768 && fillBox12 <= 65535)
                 { stringArray[fillBox12] = this._comboBox12_.Text = "X=0, " + ", Y=" + fillBox12; }
            }

            this._comboBox12_.Items.AddRange(fillBox12Items);


Muss ich das hoier irgendwo in die Formskalsse einfügen:

    public partial class Testclass : UserControl
    {

        SerialPortManager SPM = new SerialPortManager();
        string messageFormat = string.Empty;
        public Testclass_Dialog()
        {
            InitializeComponent();
            InitializeGuiValues();
        }


        /// <summary>
        /// this function can be used to initialize values of the GUI elements
        /// </summary>
        public void InitializeGuiValues()
        {
            
        }
            this._comboBox12_.TabIndex = 32;
            this._comboBox12_.Text = "X=0, Y=0";
03.03.2016 - 16:17 Uhr

Danke euch 😉

Hier die Lösung für das Auslesen der Textdatei und das Schreiben der ausgelesenen Zeilen in Comboboxen

private void button2_Click(object sender, EventArgs e)
        {
            OpenFileDialog open = new OpenFileDialog();
            open.InitialDirectory = @"C:\";
            open.Filter = "Text documents (.txt)|*.txt";

            

            if (open.ShowDialog() == DialogResult.OK)
            {
                string lines= null;
                int zeilenCounter = 0;

                using (System.IO.StreamReader file =
                new System.IO.StreamReader(open.OpenFile()))
                {

                    while ((lines = file.ReadLine()) != null)
                    {
                        zeilenCounter++;

                        if (zeilenCounter == 1)
                        { comboBox1.Text = lines; }

                        if (zeilenCounter == 2)
                        { comboBox2.Text = lines;}

                        if (zeilenCounter == 3)
                        { comboBox3.Text = lines;}
                    }
                }
            }
        }
03.03.2016 - 15:46 Uhr

So jetzt beim Auslesen habe ich noch ein kleines Problem.

Habe jetzt Ja in einer .txt 4 Zeilen mit Text.

Möchte jetzt das der Benutzer die txt auswählen kann.
Durch das Auswählen sollen die einzelnen Zeilen in comboboxen gefüllt werden.

Zeile1 in combo 1, zeile2 in combo2, .....

Da in der while Schleife passt das noch nicht. Wie weise ich den Comboboxen die richtige Zeile zu?

Was muss ich ändern?

private void button2_Click(object sender, EventArgs e)
        {
            OpenFileDialog open = new OpenFileDialog();
            open.InitialDirectory = @"C:\";
            open.Filter = "Text documents (.txt)|*.txt";

            

            if (open.ShowDialog() == DialogResult.OK)
            {
                string lines= null;
                int zeilenCounter = 0;

                using (System.IO.StreamReader file =
                new System.IO.StreamReader(open.OpenFile()))
                {

                    while ((lines = file.ReadLine()) != null)
                    {
                        zeilenCounter++;

                        if (zeilenCounter == 1)
                        { comboBox1.Text = System.Console.WriteLine(lines); }

                        if (zeilenCounter == 2)
                       // {//comboBox2.Text = lines[1];}

                        if (zeilenCounter == 3)
                        //{//comboBox3.Text = lines[2];}
                    }
                }
            }
        }
03.03.2016 - 14:55 Uhr

Danke euch. Funzt jetzt 😉
Wieder was gelernt.

Ich probier mich mal jetzt am umgekehrten Weg 😄

        private void button1_Click(object sender, EventArgs e)
        {
            stringArray[0] = "afdsfdsaf";
            stringArray[1] = "bdfdaf";
            stringArray[2] = "cdfdsaf";





            SaveFileDialog dlg = new SaveFileDialog();
            //dlg.InitialDirectory = @"C:\";
            dlg.FileName = "Preset_Name"; // Default file name
            dlg.DefaultExt = ".txt"; // Default file extension
            dlg.Filter = "Text documents (.txt)|*.txt";
            dlg.ShowDialog();


            //System.IO.File.WriteAllText(dlg.OpenFile(), string.Empty);

            using (System.IO.StreamWriter file =
                new System.IO.StreamWriter(dlg.OpenFile()))
                {
                    file.WriteLine(stringArray[0]);
                    file.WriteLine(stringArray[1]);
                    file.WriteLine(stringArray[2]);
                }
       }
03.03.2016 - 14:39 Uhr

Ja wenn ich auf speichern klicke, ist nacher kein Textdokument unter diesem Pfad zu finden.

03.03.2016 - 14:26 Uhr

@pille ja habe ich zu spät bemerkt

SaveFileDialog dlg = new SaveFileDialog();
                dlg.InitialDirectory = @"C:\";
                dlg.FileName = "Preset_Name"; // Default file name
                dlg.DefaultExt = ".txt"; // Default file extension
                dlg.Filter = "Text documents (.txt)|*.txt";
                dlg.ShowDialog();

Leider speichert er es aber nicht 😦

03.03.2016 - 14:21 Uhr
SaveFileDialog dlg = new SaveFileDialog();
                dlg.InitialDirectory = @"C:\";
                dlg.ShowDialog();
                dlg.FileName = "Preset_Name"; // Default file name
                dlg.DefaultExt = ".txt"; // Default file extension
                dlg.Filter = "Text documents (.txt)|*.txt";
                

Warum werden meine Filename und die Endung nichtübernommen?

03.03.2016 - 14:13 Uhr

Ich denke der Weg ist schon richtig un d ja habe mir die Links angeschaut,a ber keine passende Methode für meine Anwendung gefunden.

// Den Pfad kann ich öffnen

OpenFileDialog openFile = new OpenFileDialog();
openFile.InitialDirectory = @"C:\";

Aber finde keinen Befehl, der den Benutzer auffordert im geöffneten Pfad eine .txt anzulegen.

Wenn der Benutzer einen Dateinamen eingeben hat (Beispoielsweise test2) ensteht eine Datei test2.txt im ausgewählten Pfad.

Dann sollen automatisch die 3 Strings in die erstellte test2.txt geschrieben werden.
(siehe oben: streamwriter)

03.03.2016 - 13:32 Uhr

Also was ich will,

wenn Button1 geklickt wird, soll eine Textdatei enstehen.
Mache ich ja bisher mit StreamWriter.

Der Benutzer soll aber bevor die Datei abgespeichert wird den Pfad und den Dateiname angeben können bzw. dazu aufgefordert werden.

03.03.2016 - 13:10 Uhr

Hallo,

ich schreibe hier Strings zeilenweise in ein Textdokument und lese die Strings anschließend zeilenweise wieder aus und fülle sie in Comboboxen.

Bisher kann ich aber nur eine bestimmtre Datei (hier test.txt) vorgeben.

Ich möchte aber das der benutzer zur Laufzeit entscheiden kann welche .txt-Datei er auswählt.

Es geht zum Beispiel um diese Stelle:

System.IO.File.WriteAllText(@"C:\test.txt", string.Empty);

Ich will hier die Datei .txt nicht vorgeben. Der Benutzer soll selber entscheiden welche .txt er benutzen will.

  string[] stringArray = new string[4];
        private void button1_Click(object sender, EventArgs e)
        {
            stringArray[0] = "afdsfdsaf";
            stringArray[1] = "bdfdaf";
            stringArray[2] = "cdfdsaf";

            System.Diagnostics.Process.Start(@"C:\");

            System.IO.File.WriteAllText(@"C:\test.txt", string.Empty);

            using (System.IO.StreamWriter file =
            new System.IO.StreamWriter(@"C:\test.txt", true))
                {
                file.WriteLine(stringArray[0]);
                file.WriteLine(stringArray[1]);
                file.WriteLine(stringArray[2]);
            }
        }

        private void button2_Click(object sender, EventArgs e)
        {
            string[] lines = System.IO.File.ReadAllLines(@"C:\test.txt");

            comboBox1.Text = lines[0];
            comboBox2.Text = lines[1];
            comboBox3.Text = lines[2];
        }
    }
28.01.2016 - 15:04 Uhr

Ich hab mal eine Frage zur Programmierung mit Windows Forms.

Habe in meinem Programm einige Toolbox-Elemente (TextBoxen, Labels, ...)

Habe hier beispielsweise ein Button, der sämtliche Berechnungen bei der Betätigung auslösen soll. Für die Berechnungen werden Zahlen verwendet, die ich zuvor in TextBoxen geschrieben habe. Demnach muss ich bei den Berechnungen auch auf viele TextBoxen zugreifen (z.B. TextBox.Text).

Nun habe ich das Gefühl, dass mein Programmierstil nicht so gut ist, wenn
alle Berechnungen hier reinschreibe:

private void buttonMOVE_FROM_TO_Click(object sender, EventArgs e)
{
 //hier sind meine ganzen Berechnungen
}

Sollte ich meine Berechnungen in eine separate Klasse auslagern und dort wo meine Berechnungen waren nur noch entsprechende Funktionen aufrufen?

Wenn ja, wie mache ich meine Toolbox-Elemente meiner separaten Klasse bekannt? Das ist ja dann nötig, da diese in den Berechnungen benötigt werden. (zb. um die zahl aus einer TextBox auszulesen).

Kann ich das vielleicht mit einem Event lösen, dass meiner separaten Klasse alle Toolbox-Elemente bekannt macht?

Oder ist meine Struktur so in Ordnung? Man beachte, dass mein Programm noch viel umfangreicher ist. Finde es iwie unschön wenn alles in der Forms-Klasse steht.

Bin für jeden Tipp dankbar, um Struktur reinzubekommen.

        private void buttonMOVE_FROM_TO_Click(object sender, EventArgs e)
        {
            //redEllipse = true;
            //SingleMove SM = new SingleMove();

            posX = Convert.ToDouble(textBoxFROM_X.Text);
            posY = Convert.ToDouble(textBoxFROM_Y.Text);
            posX1 = Convert.ToDouble(textBoxTO_X.Text);
            posY1 = Convert.ToDouble(textBoxTO_Y.Text);

            if (posX >= 0 && posX <= pictureBox1.Width && posX1 >= 0 && posX1 <= pictureBox1.Width && posY >= 0 && posY <= pictureBox1.Height && posY1 >= 0 && posY1 <= pictureBox1.Height)
            { }

            else
            { MessageBox.Show("At least one value is out of pictureBoxRange"); }

            diffX = posX - posX1;
            diffY = posY - posY1;

            if (!(diffX == 0 && diffY == 0))
            {
                steigung = (diffY / diffX);

                hweg = ((diffX) * (diffX)) + ((diffY) * (diffY)); //px
                weg = Math.Round(Math.Sqrt(hweg), 2);

                zeit = (Convert.ToInt32(textBox_Geschw.Text)); // Zeitvorgabe für die Strecke in ms

                

                if (diffX != 0 && diffX > 0)
                {
                    zeit_pro_step = /*Convert.ToInt32*/(int)Math.Round((zeit / diffX));
                    timerMovePosition.Interval = zeit_pro_step;
                }

                else if (diffX != 0 && diffX < 0)
                {
                    zeit_pro_step = /*Convert.ToInt32*/(int)Math.Round((zeit / diffX));
                    zeit_pro_step = (-1) * zeit_pro_step;
                    timerMovePosition.Interval = zeit_pro_step;
                }

                else if (diffY != 0 && diffY > 0)
                {
                    zeit_pro_step = /*Convert.ToInt32*/(int)Math.Round((zeit / diffY));
                    timerMovePosition.Interval = zeit_pro_step;
                }

                else if (diffY != 0 && diffY < 0)
                {
                    zeit_pro_step = /*Convert.ToInt32*/(int)Math.Round((zeit / diffY));
                    zeit_pro_step = (-1) * zeit_pro_step;
                    timerMovePosition.Interval = zeit_pro_step;
                }

            }

            else if (diffX == 0 && diffY == 0)
            {
                timerMovePosition.Interval = 1000; //1s
            }

            timerMovePosition.Enabled = true;
            timerMovePosition.Start();


            //}

        }

Grüße,
Elias

19.01.2016 - 14:03 Uhr

Konnte das Problem jetzt lösen. Wer den Code brauch und in Zukunft auf dieses Thema stößt kann mir gerne eine PN schreiben.

18.01.2016 - 17:00 Uhr

Verwende ich doch. 😄 (s.o.)
Das Problem ist glaube ich, dass eben ständig neue Bilder erezugt werden, deshalb wirkt es ja wie ein Stream. Für ein Bild funktioniert das Ganze problemlos.

18.01.2016 - 16:14 Uhr

Hey Taipi,

dein Ansatz sieht vielversprechend aus.
Das Rechteck zeichne ich mit Mousevents:

private void pictureBox1_MouseDown(object sender, MouseEventArgs e)
		{
			// Starting point of the selection:
			if (e.Button == MouseButtons.Left)
			{
				_selecting = true;
				_selection = new Rectangle(new Point(e.X, e.Y), new Size());
			}
		}
		//---------------------------------------------------------------------
		private void pictureBox1_MouseMove(object sender, MouseEventArgs e)
		{
			// Update the actual size of the selection:
			if (_selecting)
			{
				_selection.Width = e.X - _selection.X;
				_selection.Height = e.Y - _selection.Y;

				// Redraw the picturebox:
				pictureBox1.Refresh();
			}
		}
		//---------------------------------------------------------------------
		private void pictureBox1_MouseUp(object sender, MouseEventArgs e)
		{
			if (e.Button == MouseButtons.Left && _selecting)
			{
				// Create cropped image:
				Image img = pictureBox1.Image.Crop(_selection);

				// Fit image to the picturebox:
				pictureBox1.Image = img.Fit2PictureBox(pictureBox1);

				_selecting = false;
			}
		}
		//---------------------------------------------------------------------

Die Image Crop und Fit2Picturebox (s.MouseUp) habe ich jetzt in eine statische Klasse ausgelagert.

Fit2PictureBox:

public static Image Fit2PictureBox(this Image image, PictureBox picBox)
        {
            Bitmap bmp = null;
            Graphics g;

            // Scale:
            double scaleY = (double)image.Width / picBox.Width;
            double scaleX = (double)image.Height / picBox.Height;
            double scale = scaleY < scaleX ? scaleX : scaleY;

            // Create new bitmap:
            bmp = new Bitmap(
                (int)((double)image.Width / scale),
                (int)((double)image.Height / scale));

            // Set resolution of the new image:
            bmp.SetResolution(
                image.HorizontalResolution,
                image.VerticalResolution);

            // Create graphics:
            g = Graphics.FromImage(bmp);

            // Set interpolation mode:
            g.InterpolationMode = InterpolationMode.HighQualityBicubic;

            // Draw the new image:
            g.DrawImage(
                image,
                new Rectangle(          // Ziel
                    0, 0,
                    bmp.Width, bmp.Height),
                new Rectangle(          // Quelle
                    0, 0,
                    image.Width, image.Height),
                GraphicsUnit.Pixel);

            // Release the resources of the graphics:
            g.Dispose();

            // Release the resources of the origin image:
            image.Dispose();

            return bmp;
        }
    }

Jetzt fehlt mir eigentlich nur noch void FinalVideoSource_NewFrame(object sender, NewFrameEventArgs eventArgs) anzupassen.

Kannst du mir da nochmal helfen?

Viele Grüße,
Elias

18.01.2016 - 13:49 Uhr

In dem oben verlinkten Projekt wird das so gelöst:

        public static Image Crop(this Image image, Rectangle selection)
        {
            Bitmap bmp = image as Bitmap;

            // Check if it is a bitmap:
            if (bmp == null)
                throw new ArgumentException("Kein gültiges Bild (Bitmap)");

            // Crop the image:
            Bitmap cropBmp = bmp.Clone(selection, bmp.PixelFormat);

            // Release the resources:
            image.Dispose();

            return cropBmp;
        }

aber wie mache ich das für meinen Webcamstream?

18.01.2016 - 13:15 Uhr

Hallo zusammen,

habe nun ein Projekt gefunden mit dem das für ein Bild funktioniert.

Projekt Image cropping

Oben habe ich ja einen ja gepostet wie mein Webcamstream einbinde.
Wie muss ich den Code verändern, dass das auch für mein Video funktioniert?

Gruß,
Elias

15.01.2016 - 13:41 Uhr


using AForge.Video;
using AForge.Video.DirectShow;

private void Form1_Load(object sender, EventArgs e)
        {
            VideoCaptureDevices = new FilterInfoCollection(FilterCategory.VideoInputDevice); // devicesstored in array

            foreach (FilterInfo VideoCaptureDevice in VideoCaptureDevices)
            {
                comboBox1.Items.Add(VideoCaptureDevice.Name);
            }

            comboBox1.SelectedIndex = 0;
        }

        //void timer_Tick(object sender, EventArgs e)
        //{
        //    throw new NotImplementedException();
        //}

        private void button1_Click(object sender, EventArgs e)
        {
            FinalVideoSource = new VideoCaptureDevice(VideoCaptureDevices[comboBox1.SelectedIndex].MonikerString);
            FinalVideoSource.NewFrame += new NewFrameEventHandler(FinalVideoSource_NewFrame);
            FinalVideoSource.Start();
        }

        void FinalVideoSource_NewFrame(object sender, NewFrameEventArgs eventArgs)
        {
            Bitmap image = (Bitmap)eventArgs.Frame.Clone();
            pictureBox1.Image = image;
        }

15.01.2016 - 12:50 Uhr

Was ich dann bräuchte:

Wie man ein Videostream zuschneidet?

15.01.2016 - 10:55 Uhr

Stimmt. sie verändert sich von rechts und unten. Mein Fehler 😄

Das sich das Bild herausschiebt wäre kein Problem.

Was ich vielelicht noch dazusagen sollte. Das ganze ist kein Image in der picture Box sondern ein WebcamStream.

Ich glaube deshalb fast das diese Idee besser wäre, wenn man die pictureBox von OBEN und LINKS nicht verkleinern kann:

Rectangle zur Laufzeit über das iPad ziehen und dann z.B. auf einen Button klicken so dass die pictureBox sich genau auf den Rectangle-Bereich anpasst. Da hapert es aber leider an der Umsetzung weshalb ich ersteres präferieren würde.

15.01.2016 - 10:40 Uhr

Hallo es geht ja um die pictureBox.

Habe eine pictureBox eingefügt und zwei Buttons:


private void button3_Right_Click(object sender, EventArgs e)
        {
           pictureBox1.Width = pictureBox1.Width - 5;
        }

private void button4_Top_Click(object sender, EventArgs e)
        {
           pictureBox1.Height = pictureBox1.Height - 5;
        }

Kannst ja mal selber ausprobieren: Picturebox, 2 Buttons und der obere Code. Es ist genau andersherum:

WIDTH wird von RECHTS kleiner.
HEIGHT wird von OBEN kleiner.

Wie soll mir da jetzt Location weiterhelfen?

Jetzt brauche ich noch 2 Buttons mit denen ich die Picturebox von LINKS und von UNTEN verkleinern kann.

15.01.2016 - 09:49 Uhr

Was ich mir auch noch vorstellen könnte:

Ich zeichne ein Rectangle über das iPad und die pictureBox soll sich dann auf die Größe des Rectangles einstellen.

Aber weiß nicht wie ich das umsetzen könnte.

15.01.2016 - 09:27 Uhr

Ja aber die Position hilft mir ja da reichlich wenig. Ich will die pictureBox ja nicht verschieben.

Am liebsten wären mir 4 Buttons mit denen ich die picturebox von jeweils allen Seiten verkleinern kann.

Width und Height machen das ja schon teilweise. Nur verkleinern diese eben die PictureBox nur von OBEN und von RECHTS. Jetzt bräuchte ich noch was die pictureBox von LINKS und UNTEn her verkleinert.

14.01.2016 - 17:02 Uhr

Beim Zoomen sehe ich aber das Problem, dass sich mein Bild:

verzerrt: meine PicBox ist momentan 640:480 groß. Das iPad hat aber ein ganz anderes Seitenverhältnis (nehmen wir mal quadratisch 400x400 an) würde ich das jetzt ranzoomen wäre mein qudratisch ipad als 640x480 Verhätnis abgebildet.

Das ist der Grund warum ich die Größe der PictureBox verändern lassen will. So kann ich immer je nachdem welches Seitenverhätnis das iPad hat durch Anpassen der Picturebox exakt dasselbe Seitenverhätnis bekommen.

Beispiel: Ist mein ipad wie oben z.B Qudratisch, könnte ich meine picture Box auch quadratisch ziehen.

Verstehst du was ich meine?

14.01.2016 - 15:49 Uhr

So soll es danach aussehen:

eig sollte die picturebox hier kleiner sein.

Aber habe geschummelt indem ich die Webcam näher rangerückt habe.

Hier soll nur klar werden, dass man versteht welcher Teil noch in der pictureBox noch zu sehen sein soll.

14.01.2016 - 15:48 Uhr

Hallo,

ich filme mit einer Webcam ein iPad. Der WebcamStream ist in einer pictureBox eingebunden.

Ich möchte, dass der Anwender zur Laufzeit die Größe der PictureBox ändern/verkleinern kann.
So, dass nacher auf dem Webcamstream nur noch das iPad zusehen ist und kein unnötiger Hintergund.

Ich habe schon probiert, dass mit Buttons zu lösen. Leider kann ich mit den Properties Width and High die PictureBox nur von OBEN und RECHTS her verändern/verkleinern.


        private void button1_Click(object sender, EventArgs e)
        {
            pictureBox1.Width = pictureBox1.Width - 1;
        }

       private void button2_Click(object sender, EventArgs e)
        {
            pictureBox1.Height = pictureBox1.Height - 1;
        }

Gibt es auch Eigenschaften, um die PictureBOx von LINKS und OBEN zu verändern?

oder wie würde ihr das Problem lösen?

Liebe Grüße,
Elias

23.12.2015 - 09:17 Uhr

Hallo Muck,

hast du noch den Sourcecode?

Ich möchte auch ein Fadenkreuz über ein Webcambild legen, dass mit der Maus verschiebbar ist und die aktuellen koordinaten anzeigt.

Grüße
Elias

27.11.2015 - 15:48 Uhr

Ich glaub bisher hat keiner verstanden, wie das Steuern funktionieren soll. Gibts nen Kabel, gibts nen Roboter, wer übernimmt die Ausführung auf dem Gerät (denn auf dem Gerät läuft offensichtlich kein .NET)....

Der Touchscreen liegt nur rum und soll nicht direkt bedient werden. Der Mensch sitzt an einem PC (das ist nicht der Touchscreen und der Bildschirm des PCs ist nicht touchfähig). Der Touchscreen liegt einfach i.wo neben dem PC. Verbinden würde ich PC und Touchscreen vllt iwie seriell um Daten zu übertargen. Zur Steuerung: Der Mensch benutzt die PC Maus und drückt auf die Buttons seiner Windowsforms. Dadurch sollen entsprechende Events ausgelöst werden, so dass die entsprechenden Signale an den Touchscreen übertragen werden und dadurch dann ein Touch/Geste ausgelöst wird.

26.11.2015 - 14:25 Uhr

Bitte formuliere die "ich möchte einen Touchscreen steuern" anders. Ein Touchscreen kann alles mögliche sein. So wie es aussieht, möchtest du speziell ein BlackBerry steuern.

Ja so ähnlich. Konkret geht es um den Touchscreen aus einem Auto, der ja von der HeadUnit gesteuert wird. Vielleicht hilft das ja weiter...

26.11.2015 - 14:20 Uhr

verstehe ich das richtig: Du willst eine Windows-Anwendung auf einem PC laufen lassen und über ein Blackberry steuern?

Nein genau andersrum. Über die Windows Form Elemente (Buttons) möchte ich den Touchscreen steuern. Wobei die Buttons auf dem PC mit der Maus betätigt werden.

26.11.2015 - 13:33 Uhr

Was für ein Betriebssystem läuft denn auf dem Touchscreen/Tablet?
Davon hängt sehr wahrscheinlich ab, ob das überhaupt geht und wenn ja, welche Befehle du schicken musst.

Plattform des Touchscreen ist QNX. Auf dem Pc habe ich Windwos 7

26.11.2015 - 13:05 Uhr

Ist der Touchscreen ein stinknormaler Monitor?
Oder ein Tablet?
Oder...?

Mir fehlt da grade die technische Verbindung...

Nein, nicht nur ein Monitor. Ja so etwas wie ein Tablet.
Man kann den Touchscreen (von mir aus auch Tablet) auch ganz normal mit der Hand bedienen.
Aber das möchte ich ja nicht. Ich möchte den Touchscreen mit Formelementen am PC bedienen über Mausklicks auf Buttons.
Und deshalb brauch ich ja iwie die Befehle für die Touchsignale. Da ich die Touchsignale ja selber generieren muss. Also muss ja hinter jedem Button der Befehl für die entsprechende Geste stehen.

klarer geworden?