Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Portal
  • |
  • Mitglieder
Beiträge von Spook
Thema: Schnelle Konvertierung von Grayscale zu RGB (WPF)
Am im Forum: Grafik und Sound

Hallo Th69,

dann ist deine Antwort natürlich richtig.

Grüße
spooky

Thema: Schnelle Konvertierung von Grayscale zu RGB (WPF)
Am im Forum: Grafik und Sound

Hallo robbb26,

bei mir funktioniert es (siehe screenshot).


grüße
spooky

Thema: Schnelle Konvertierung von Grayscale zu RGB (WPF)
Am im Forum: Grafik und Sound

Hallo robbb26,

ich würde dies mit einer lookup table lösen:

  [StructLayout(LayoutKind.Sequential, Pack = 1)]
    public struct RGB24
    {
        public byte B;
        public byte G;
        public byte R;

        public RGB24(byte value)
        {
            B = value;
            G = value;
            R = value;
        }
    }

    public class ImageConverter
    {
        private RGB24[] _lut;

        public ImageConverter()
        {
            _lut = new RGB24[256];
            for (int i = 0; i < _lut.Length; i++)
            {
                _lut[i] = new RGB24((byte)i);
            }
        }

        public unsafe byte[] ToRGB24(byte[] data)
        {
            byte[] result = new byte[data.Length * 3];
            fixed (byte* bptr = result)
            {
                RGB24* ptr = (RGB24*)bptr;
                for (int i = 0; i < data.Length; i++)
                {
                    ptr[i] = _lut[data[i]];
                }
            }
            return result;
        }
    }

Grüße
spooky

Thema: Nach GetFiles Pfad zu den Dateien ermitteln
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Hallo,

FileInfo-Klasse
FileSystemInfo.FullName-Eigenschaft

sollte dir weiterhelfen.

grüße

Thema: ComPort öffnen schlägt fehl
Am im Forum: Rund um die Programmierung

Hallo Hummakavula,

SerialPort.GetPortNames aufrufen und schauen, ob der Port gelistet wird.

grüße
spooky

Thema: C# / Mono um Scriptsprache erweitern
Am im Forum: Rund um die Programmierung

Zitat von burli70
Wie sieht es denn mit der Performance von C# Scripten aus? Ist das genauso schnell wie normaler C# Code?

Ja, dieser ist so schnell wie C# Code. Er wird wie der "normale" Code vor der ersten Ausführung vom JIT kompiliert, d.h. der erste Aufruf ist minimal langsamer.

Thema: Ist Mono geeignet für Sandbox Spiele wie Minecraft?
Am im Forum: Grundlagen von C#

Analysing Pause times in the .NET GC

Thema: Ist Mono geeignet für Sandbox Spiele wie Minecraft?
Am im Forum: Grundlagen von C#

Die Frage ist wie lange der GC die Anwendung anhalten kann, ohne dass es den Benutzer stört. Dies hängt natürlich von mehreren Faktoren ab: Runtime, GC Konfiguration, Größe der Anwendung, erwartete Framerate, ...

Wenn du dieses Risiko nicht eingehen willst, dann müsstest du direkt eine Umgebung ohne GC verwenden.
Dabei solltest du bedenken, dass die GC-Zeiten wachsen werden, wenn deine Anwendung wächst. D.h. dies kann sich erst im Laufe der (Weiter)Entwicklung bemerkbar machen.

Hier ein Artikel der dir möglichweise weiterhilft:
Fundamentals of Garbage Collection

Thema: Download Methode bring Server in den Status "No buffer space available"
Am im Forum: Netzwerktechnologien

Hallo,

writer.Write(buffer, 0, bytesRead);

müsste es noch heißen.

Grüße
spooky

Thema: VS2015 - Datei mit selbst erstelltem Zertifikat wird ohne Signatur erstellt
Am im Forum: Entwicklungs- und Laufzeitumgebung (Infrastruktur)

Hallo marabunta,

die .NET Assembly mit einem starken Namen zu versehen ist nicht das gleiche wie die DLL oder EXE mit einem Zertifikat zu signieren (das du z.B. im Windows Explorer angezeigt bekommst).

Das hilft dir möglicherweise weiter:
Strong-Named Assemblies.

Grüße
spooky

Thema: Klärung der Begriffe "LockBit", "Marshal", "verwalteter Speicher" und "nicht verwalteter Speicher"
Am im Forum: Grundlagen von C#

Hallo Gimmick,

deine Methode BildArray() behandelt das mögliche Speicherlayout von Bildern nicht korrekt.
Weder achtest du auf Padding-Bytes, noch darauf, dass die Stride negativ sein kann (damit meine ich nicht, dass du diese mit Math.Abs positiv machst).
Wenn die Stride negativ ist, so liegt das Bild im Speicher Bottom-Up anstatt Top-Down, ergo kannst du nicht von Scan0 aus einfach das Bild kopieren.

Du musst entweder jede einzelne Zeile des Bildes kopieren und dabei auch die möglichen Padding-Bytes berücksichtigen. Oder du machst es dir etwas einfacher, und schreibst dir diese Methode so um, dass diese keine Konversion macht und byte[] zurückgibt. Dann musst du weder Stride noch Padding-Bytes berücksichtigen.

In der Methode button1_Click() solltest du den Rückgabewert zwischenspeichern und wiederverwenden, da du ansonsten bei jedem Durchlauf die Umwandlung zwei Mal durchführst.

Grüße
spooky

Thema: fixed CHar[] in ASCII definieren und als string ausgeben
Am im Forum: Grundlagen von C#

Hallo Gerri3d,

wenn die Daten extern ASCII sind, würde ich als Datentyp in deiner Struct byte verwenden anstatt char. Damit kannst du dann auch einfacher mit Hilfe von ASCII Encoder die Bytes in einen String umwandeln.

PS: ANSI ist meines Wissens nach 1 Byte pro Zeichen.

Grüße
spooky

Thema: Nicht genügend Quoten, um den angeforderten Dienst auszuführen bei Dauerbetrieb
Am im Forum: GUI: WPF und XAML

Hallo,

warum schreibst du in einer WPF-Anwendung in die Konsole? Hast du diese umgeleitet in eine Datei oder manuell eine Konsole geöffnet?

Entferne die Console.WriteLine(..) Aufrufe (die ja den Fehler auslösen) und schau ob das Programm dann korrekt funktioniert.
Dann kannst du auch den Handle "Leak" ausschließen.

Grüße
spooky

Thema: Nicht genügend Quoten, um den angeforderten Dienst auszuführen bei Dauerbetrieb
Am im Forum: GUI: WPF und XAML

Hallo PoWl,

könntest du bitte den Code der Methode "P_Slideshow_Vorabversion.MainWindow.<ImageChangeTimer_Tick>d__24.MoveNext()" posten. Vielleicht kommen wir damit weiter.

Danke

spooky

Thema: Rechteck in OnRender() von System.Controls.Image über Imagesource zeichnen
Am im Forum: GUI: WPF und XAML

Hallo ByteDevil,

dieser Code zeichnet bei mir über das verwendete Bild:

    public class Test : Image
    {
        protected override void OnRender(DrawingContext dc)
        {
            base.OnRender(dc);
            var size = RenderSize;
            dc.DrawRectangle(Brushes.Red, null, new Rect(size.Width / 4, size.Height / 4, size.Width / 2, size.Height / 2));
        }
    }

Grüße
spooky

Thema: Wie kann man Bitmap in HBITMAP konvertieren?
Am im Forum: Grafik und Sound

Hallo doubleII,

wenn in der C++ Funktion der Parameter vom Typ HBITMAP* definiert ist, dann definiere den Parameter in C# mit ref:

[DllImport("Toolbox.dll", CharSet = CharSet.Unicode, CallingConvention = CallingConvention.Cdecl, EntryPoint = "Execute")]
static extern int Execute(uint count, ref HBITMAP bmp);


Grüße
spooky

Thema: RGB Werte aller Pixel eines Bildes überprüfen mit Lockbits
Am im Forum: Grafik und Sound

Es müsste

data.PixelFormat = PixelFormat.Format24bppRgb; // <--
sein.

Grüße
spooky

Thema: RGB Werte aller Pixel eines Bildes überprüfen mit Lockbits
Am im Forum: Grafik und Sound

Hallo Elias,

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

du kannst das Format einfach beim Locken der Bitmap angeben. Du kannst sogar gleichzeitig die Konvertierung in einen von dir verwendeten Speicher vornehmen:

struct BGR
{
    public byte B;
    public byte G;
    public byte R;
}

static BGR[,] GetPixels(Bitmap bitmap)
{
    Contract.Requires(bitmap != null);

    BGR[,] pixels = new BGR[bitmap.Height, bitmap.Width];
    GCHandle handle = GCHandle.Alloc(pixels, GCHandleType.Pinned);
    try
    {
        BitmapData data = new BitmapData();
        data.PixelFormat = PixelFormat.Format24bppRgb;
        data.Width = bitmap.Width;
        data.Height = bitmap.Height;
        data.Stride = bitmap.Width * 3;
        data.Scan0 = handle.AddrOfPinnedObject();
        data = bitmap.LockBits(new Rectangle(0, 0, bitmap.Width, bitmap.Height), ImageLockMode.ReadOnly | ImageLockMode.UserInputBuffer, bitmap.PixelFormat, data);
        bitmap.UnlockBits(data);
    }
    finally
    {
        handle.Free();
    }
    return pixels;
}

Hier ist das Ausgabeformat 24bpp BGR. Du kannst natürlich die Struct für den einzelnen Pixel und das Format entsprechend anpassen (Stride nicht vergessen).
Ob die Konvertieren wirklich alle Formate beliebig konvertieren kann, kann ich dir nicht sagen.

Grüße
spooky

Thema: [erledigt] Wie übersetze ich das Feld "char szAccess[2]" aus einer C++ lib in C#?
Am im Forum: Rund um die Programmierung

Hallo,

du könntest es als byte[] definieren und mit mit dem MarshalAs Attribut in Kombination mit UnmanagedType.ByValArray und SizeConst=2 versehen.

Grüße
spooky

PS: char aus C++ ist in .NET byte.

Thema: Ablauf/ Struktur einer Echtzeit Anwendung (hier 33ms ) Bildschirm Darstellungsproblem
Am im Forum: Rund um die Programmierung

Hallo luciluke,

du könntest dir folgende Dinge anschauen:

Multimedia Timer Dieser bietet eine bessere Auflösung als die im Framework vorhandenen Timer (~1ms).

Zusätzlich kann der GC selbst die Anwendung anhalten, was zu Rucklern führt. Ganz besonders bei full blocking collections. Möglichweise das was du als Ungleichmäßig beschreibst. Dort kann dir möglichweise die Verwendung von SustainedLowLatency weiterhelfen.

Du kannst auch die Auflösung des Windows Schedulers selbst erhöhen, so dass dieser nicht bei ~15ms liegst sondern bei 0.5ms. NtSetTimerResolution
NtQueryTimerResolution
NtSetTimerResolution

Grüße
spooky

Thema: Fakultät von Int wird bei 22 negativ, dann wieder positiv
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

22! viel größer als Int32.MaxValue (2^31-1)
Daher hast du Überläufe vom Positiven ins Negative und wieder zurück.

Mit BigInteger sollte es gehen.

Thema: Assembly zu eigener Assembly hinzufügen, die einen starken Namen hat
Am im Forum: Rund um die Programmierung

Die Datei muss nicht eingebettet werden. Diese kann einfach nachträglich signiert werden.

Thema: Assembly zu eigener Assembly hinzufügen, die einen starken Namen hat
Am im Forum: Rund um die Programmierung

http://www.blackwasp.co.uk/ILMergeSigned.aspx (Abschnitt "Signing Without Merging")http://www.microsoft.com/en-us/download/details.aspx?id=17630 (Download ILMerge)

Thema: Zugriff von 64-Bit auf 32-Bit Dll, Elegantere lösung als über 32-Bit COM?
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Hallo,

wenn du native DLLs als Abhängigkeiten hast, dann macht es keinen Sinn AnyCPU zu verwenden, außer du lädst diese dynamisch, so dass beide Architekturen funktionieren.
Die meisten Bibliotheken, werden als AnyCPU vorliegen, da diese eben keine nativen Abhängigkeiten haben und damit von x86 und x64 Anwendungen verwendet werden können. Das ist gerade das tolle, dass du eine reine .NET Anwendung eben nicht fix auf eine Architektur kompilieren musst.

Wenn dies nicht der Fall ist, dann kompiliere entweder als x86 oder als x64. Bei uns ist dies nur bei der .exe der Fall, da diese entscheident ist. Alle (.NET) DLLs sind AnyCPU.


Grüße
spooky

Thema: Windows service, Setup Prozess nach Setup Prozess starten.
Am im Forum: Netzwerktechnologien

Hallo,

du kannst mit der WaitForSingleObject Funktion warten, bis ein Prozess beendet wurde. Diese mit dem hProcess-Handle deines procInfo out-Parameters und dem passenden Timeout (vermutlich INFINITY 0xFFFFFFFF als uint oder -1 als int) aufrufen.

Alternativ kannst du auch mit der Process-Klasse (und dem dwProcessId-Member) arbeiten:

Process.GetProcessById((int)info.dwProcessId).WaitForExit();


Grüße
spooky

Thema: Universal App: Bitmap in Gridview binden ohne Referenz auf physische Datei
Am im Forum: GUI: WPF und XAML

Hallo ChristophF,

ich würde die Datei in einen MemoryStream kopieren und diesen zum Laden verwenden, da die Datei dann nicht geöffnet bleibt.
Am einfachsten ist es die Datei als Stream zu öffnen und mit CopyTo in den MemoryStream zu kopieren.
Danach die Position des MemoryStreams wieder auf 0 setzen und dann zum Laden des Bildes vewenden (den danach FileStream natürlich mit Close oder Dispose schließen).

Grüße
spooky

Thema: volatile und Multithreading - Race bei i += 7
Am im Forum: Rund um die Programmierung

In deinem Verlinkten Artikel steht ebenfalls:

Zitat
Die C# ECMA-Spezifikation garantiert, dass die folgenden Typen atomar geschrieben werden: Verweistypen, „bool“, „char“, „byte“, „sbyte“, „short“, „ushort“, „uint“, „int“ und „float“.

Ich vermute dass 64bit Datentypen in einem 64bit Prozess ebenfalls atomar geschrieben werden können.

Thema: volatile und Multithreading - Race bei i += 7
Am im Forum: Rund um die Programmierung

Hallo gunnag,

Zitat von gunnag
das Schlüsselwort volatile gibt mir eine acquire und release semantic (also keinen full-fence).

Das volatile Schlüsselwort bewirkt, dass der Inhalt nicht gecacht, sondern bei jedem (lesenden) Zugriff neu aus dem Speicher in ein Register kopiert wird.

Eine genauere Beschreibung findest du hier:
volatile (C#-Referenz)

Ich frage mich eher, ob die Variable als volatile deklariert werden muss. Dies ist in diesem Fall vermutlich unsinnig, da der Property-getter die Variable eh nicht cachen kann und frisch aus dem Speicher auslesen muss. Solange nur Thread 2 die Variable ändert, kannst du volatile weglassen.

Grüße
spooky

Thema: Bei 2 o. 3 Screens den Inhalt in ein Fenster "Clonen"
Am im Forum: Grafik und Sound

Diese Methode sollte dir weiterhelfen:
Graphics.CopyFromScreen

Um die Bildschirme auszumessen, kannst du die Screen-Klasse verwenden.

Grüße
Spooky

Thema: Access Violation bei TCL-Kommandoaufruf über DLL
Am im Forum: Rund um die Programmierung

Hallo,

kannst du bitte die originale Definition der Methodensignatur (C/C++) posten?

spooky