Laden...

Profil von toxic

myCSharp.de - Member Mitglied seit

Alle Beiträge

So für die Nachwelt hier die Lösung;

Es gibt zwei verschiedene Basisklassen um ein Cmdlet zu erstellen. (Cmdlet und PSCmdlet)

Kleine Beschreibung siehe hier.

Wenn man also von PSCmldet erbt, und nicht so wie ich von Cmdlet, kann man auch auf den ParameterSetName zugreifen.

So würde es mit Reflection funktionieren:

var setName = this.GetType().GetProperty("_ParameterSetName", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance).GetValue(this).ToString();

Hi,

ich komme gerade nicht weiter. Es gibt ja in Powershell die Möglichkeit mit Parametersets zu arbeiten.
Wie bei Stackoverflow schön gezeigt, kann man im Script schön den aktuellen Namen des Parametersets abrufen:


switch ($PsCmdlet.ParameterSetName) {
    "FromFile_ParamSet" {

    }
    "FromUri_ParamSet" {

    }
}

Wenn ich im C# ein Cmdlet erstelle, komm ich an dieses Property aber nicht ran. Das Feld wo es steht ist private. Ich könnte jetzt natürlich mit Reflection mir den Wert auslesen, aber das kann ja nicht der Sinn der Sache sein. Habt ihr eine Idee.
Anbei ein Screenshot vom Debugger.


using System;
using System.Collections.Generic;
using System.Linq;
using System.Management.Automation;
using System.Text;
using System.Threading.Tasks;

namespace PowerShellModule
{
    [Cmdlet(VerbsCommon.New, "CmdletTest", DefaultParameterSetName = "ParaSet1")]
    public class NewTeamcenterSessionCmdlet : Cmdlet
    {
        [Parameter(Mandatory = true, ParameterSetName = "ParaSet1")]
        public string Parameter1 { get; set; }

        [Parameter(Mandatory = true, ParameterSetName = "ParaSet2")]
        public string Parameter2 { get; set; }


        protected override void BeginProcessing()
        {
            WriteVerbose("BeginProcessing");
        }

        protected override void ProcessRecord()
        {
            WriteVerbose("ProcessRecord");            
        }

        protected override void EndProcessing()
        {
            WriteVerbose("EndProcessing");
        }

        protected override void StopProcessing()
        {
            WriteVerbose("StopProcessing");
        }
    }
}
07.05.2019 - 14:10 Uhr

Tolle Arbeit. Muss auch mal gesagt werden.

Und Dankeschön für die Tolle Arbeit! 😁 👍

Ich würde es garnicht programmieren wollen...nimm PowerQuery von Microsoft.
Ist ein kostenloses ExcelPlugin das genau das kann.

Ab Excel 2016 ist es dabei und heißt Get and Transform.

Hi,

schau dir mal das NuGet Package FileHelpers an...

klick mich

Ja, REST ist für sowas aktueller und besser (inhaltlich: Security, Erweiterbarkeit, Hosting...).

Danke Abt, dass wollte ich hören 😁

Hi toxic,

wäre das dann nicht eher ein Anwendungsfall für ein Plugin für die CAD-Anwendung?

Ja es ist ein Plugin für eine CAD Anwendung, dass etwas an eine andere Geschäftsanwendung übergeben soll...

Ist das hier für Dich interessant ?

[FAQ] mehrere Programminstanzen verhindern (inkl. Parameterübergabe)

Grüße Bernd

Bis jetzt hab ich es ja so mit Remoting Mutex etc. realisiert. Ich frage mich ob es per REST und Selfhosted nicht einfacher, "besser", aktueller wäre...

Nein das mein ich nicht.
Ich habe in einem CAD System z.B. ein Bauteil geöffnet und möchte aus diesem einer anderen Anwendung (z.B. einem Befundsystem) sagen, mach bitte den Befund von dem im CAD geöffneten Teil auf.

Ich möchte also nur einen Befehl an die andere Software übergeben...mit einem simplen Parameter wie einer Materialnummer.

Für so Kleinigkeiten.
Bei Word kann ich ja über die Befehlzeile mitgeben, welches Dokument geöffnet werden soll.
So was ähnliches, nur das eben die Anwendung schon offen ist, und es auch nur eine Instanz von ihr gibt.

Die Anwendung laufen auch auf dem selben Client. Ich möchte keine Daten über einen zentralen Server verschieben sondern einfach nur einer anderen Anwendung sagen, mach was...

Hi,

wir haben hier verschiedene Geschäftsanwendungen (GUI-Anwendungen) die Daten miteinander austauschen sollen. Einfaches Beispiel: Öffne Produkt XYZ im Befundsystem etc.

Ich hab sowas eigentlich immer über Remoting gemacht. (RemotingConfiguration.RegisterWellKnownServiceType)


using System.Runtime.Remoting;
using System.Runtime.Remoting.Channels;
using System.Runtime.Remoting.Channels.Ipc;

In letzter Zeit habe ich auch ein paar Services geschrieben (OWIN REST) und hab mir die Frage gestellt ob das nicht ein einfacherer Weg wäre.

Macht das jemand schon so? Gibt es was, was dagegen spricht. So könnte ich halt Objekte etc sehr einfach von einer in die andere Anwendung schupsen. Beide Anwendungen würden dann über einen Port, ein REST API zu Verfügung stellen (Self hosted) und gut ist...

Oder ist Remoting doch noch die Richtige Wahl dafür...

Nicht für jedes Produkt, aber es gibt bei uns 4 Produktbereiche.
Diese möchte ich abbilden.

Falls wir ein Hersteller von Autos und Motorräder währen, würde ich eine Klasse Fahrzeug, ein Auto und Motorrad machen. Diese haben wiederum Änderungsstände.

So falsch kann das doch nicht sein oder? Ein Auto hat doch ganz andere Eigenschaften wie ein Motorrad, aber eben auch gleiche...

Hi,

also ich hab euch noch mal ein Klassendiagramm angehängt. So stell ich mir das Ganze vor.
Nach meiner Meinung macht das Modell eigentlich schon so Sinn. (Sonst hätte auch alle PLM System einen falschen Ansatz 😉 )

Wie würdet ihr das dann im EF abbilden?

Ja das Datenmodell ist so gewollt.
Das ganze dient ja hier nur zu Veranschaulichung.

Bei uns gibt es verschiedene Produkte (diese haben verschiedene Eigenschaften und auch gemeinsame) und die Produkte sollen Änderungsstände haben (diese haben auch verschiedene Eigenschaften und auch gemeinsame)

Ist in einem PLM-System (z.B. Teamcenter von Siemens eine ganz normale gänige Praxis)

Das die abstracten-Klassen aus dem Context rauszunehmen sind, macht Sinn und ist auch klar.

Aber das ändert ja nichts an meinem Problem.

Wieso findet EF die "AutoID" nicht, sie wird doch mitvererbt...das ist für mich eigentlich die Frage.
Die Kombis und SUVs haben doch auch in der Tabelle die "AutoID" als PrimaryKey und als Foreign Key zur Tabelle "Autos". Oder nicht?

@Abt, das mit TPT hast du gelessen? Dann kann ich doch die Eigenschaften von dieser Vererbungsebene in eine gemeinsame Tabelle schreiben "Autos".

Siehe hier https://weblogs.asp.net/manavi/inheritance-mapping-strategies-with-entity-framework-code-first-ctp5-part-2-table-per-type-tpt und Zitat von http://www.entityframeworktutorial.net/code-first/inheritance-strategy-in-code-first.aspx

Table per Hierarchy (TPH): This approach suggests one table for the entire class inheritance hierarchy. Table includes discriminator column which distinguishes between inheritance classes. This is a default inheritance mapping strategy in Entity Framework.
Table per Type (TPT): This approach suggests a separate table for each domain class.
Table per Concrete class (TPC): This approach suggests one table for one concrete class, but not for the abstract class. So, if you inherit the abstract class in multiple concrete classes, then the properties of the abstract class will be part of each table of the concrete class.

verwendetes Datenbanksystem: LocalDB

Hi,

ich versuche folgendes Modell per Code First aufzubauen.
Bei der Generierung bekomme ich folgende Fehlermeldung:

Fehlermeldung:
Die Fremdschlüsselkomponente 'AutoID' ist keine für den Typ 'Kombiaenderungsstand' deklarierte Eigenschaft. Vergewissern Sie sich, dass sie nicht explizit aus dem Modell ausgeschlossen wurde und dass es sich um eine gültige primitive Eigenschaft handelt.

Zum einen hat er ja recht, der "Kombiaenderungsstand" hat keine AutoID. Aber müsste er diese nicht per Vererbung mitbekommen? Wie könnte ich das lösen?
Muss ich wirklich unter "Kombi" eine Liste mit "Autoaenderungsstaende" hängen?

Oder liegt das an TPT, geht das dann nicht?


using System;
using System.Collections.Generic;
using System.Data.Entity;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace WPMS2_EF_Test
{
    public class AutoContext : DbContext
    {
        public DbSet<Kombi> Kombis { get; set; }
        public DbSet<SUV> SUVs { get; set; }
        public DbSet<Kombiaenderungsstand> Kombiaenderungsstaende { get; set; }
        public DbSet<SUVaenderungsstand> SUVaenderungsstaende { get; set; }

        public AutoContext() : base()
        {

        }

        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            modelBuilder.Entity<Auto>().ToTable("Autos");
            modelBuilder.Entity<Kombi>().ToTable("Kombis");
            modelBuilder.Entity<SUV>().ToTable("SUVs");
            modelBuilder.Entity<Autoaenderungsstand>().ToTable("Autoaenderungsstaende");
            modelBuilder.Entity<Kombiaenderungsstand>().ToTable("Kombiaenerungsstaende");
            modelBuilder.Entity<SUVaenderungsstand>().ToTable("SUVaenderungsstaende");

            modelBuilder.Entity<Kombi>()
                .HasMany<Kombiaenderungsstand>(x => x.Kombiaenderungstaende)
                .WithRequired()
                .HasForeignKey(x => x.AutoID);

            modelBuilder.Entity<SUV>()
                .HasMany<SUVaenderungsstand>(x => x.SUVaenderungstaende)
                .WithRequired()
                .HasForeignKey(x => x.AutoID);
        }

        public abstract class Auto
        {
            public virtual int AutoID { get; set; }
            public ICollection<Autoaenderungsstand> Autoaenderungstaende { get; set; }
        }

        public class Kombi : Auto
        {
            public ICollection<Kombiaenderungsstand> Kombiaenderungstaende { get; set; }
        }

        public class SUV : Auto
        {
            public ICollection<SUVaenderungsstand> SUVaenderungstaende { get; set; }
        }



        public abstract class Autoaenderungsstand
        {
            public virtual int AutoaenderungsstandID { get; set; }
            public virtual int AutoID { get; set; }
        }

        public class Kombiaenderungsstand : Autoaenderungsstand
        {

        }

        public class SUVaenderungsstand : Autoaenderungsstand
        {

        }
    }

}


22.05.2017 - 15:11 Uhr

Danke, hat perfekt funktioniert!

22.05.2017 - 10:56 Uhr

Hi,

ich hab die Anforderung je nach URL, einen anderer Browser zu öffnen.
Also möchte ich den Standradbrowser in Windows auf meine "APP" umbiegen, die dann die URL im hinterlegten Browser öffnet.
Das Thema kennen vielleicht mittlerweile viele Firmen. Auch wenn eine Webanwendung heutzutage Browserneutral sein soll, die Realität sieht leider ganz ganz anders aus. Webanwendung A läuft nur im IE, dafür B nur im Chrome und C läuft am besten im Firefox.

Mein Problem ist, dass ich nicht hinbekomme das meine APP überhaupt von Windows als Browser erkannt wird. Sprich ich kann sie in der Systemsteuerung etc. nicht als Standardbrowser auswählen. IE, Edge, Firefox und Chrome werden erkannt. Wie kann ich da selbt ein benutzerdefiniertes Programm auswählen? Hat das schon jemand mal gemacht?

Wie weiß Windows überhaupt, dass es sich bei Firefox um einen Browser handelt, der das das und das kann? Hab schon mit shell:appsfolder rumprobiert, ich komm aber auf keinen grünen Zweig...

P.S.: nebenbei, kennt einer die Problematik an sich? Wie wird das in anderen Firmen gemacht? Ich kann doch irgendwie keinem Nutzer zumuten, wenn er ne Mail mit Link bekommt...Link kopieren...Kopfgesteuerte den "richtigen" Browser öffnen...einfügen und los...oder?

Vielen Dank un Gruß

22.03.2017 - 09:15 Uhr

        public static double GetCacheSize()
        {
            return 0;
        }

...ähm ja, Klassiker 🙂

Okay, erstmal vielen Dank für eure Hilfe.

Ich seh schon, ich komm um eine dritte Tabelle nicht rum.
Wünschenswert vom EF wäre für mich, so in etwa, folgendes gewesen (.MutipleAdd(true);):


        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            modelBuilder.Entity<Auto>()
                .HasMany<Sensor>(X => X.Sensoren)
                .WithMany(x => x.Autos)
                .Map(m =>
               {
                   m.MapLeftKey("AutoID");
                   m.MapRightKey("SensorID");
                   m.ToTable("AutoSensoren");
               })

               --> .MutipleAdd(true);

        }

Das EF vielleicht in der Zwischentabelle noch selbst eine ID einfügt, so wie Palin das beschrieben hat.

So muss ich ja jetzt leider immer selbst die Zuweisungen über eine Zwischentablle machen.

@Abt, dass was du geschrieben hast, wäre ja eher nur über eine Enum möglich. ("Type = SensorType.Digital") Das wollte ich aber vermeiden, weil wenn es einen neuen Sensortyp gibt, müsste ich ja die Anwendung neu erstellen.

Bei Many To Many wird ja im SQL nur eine Zwischentabelle angelegt. Grob (AutoID|SensorID) wenn du den gleichen Sensor der gleichen Maschine noch einmal zuordnen würdest. Hattest du zwei gleiche Eintrage, bei denen die Spalten nicht zu unterscheiden wären. (1|1) (1|1). Wenn du das machen möchtest brauchst du noch eine Spalte z.B. (ID|AutoID|SensorID) dann funktioniert das.

Ja genau so hab ich mir das gedacht. Mir ist die Unterscheidung zwischen (1|1) und (1|1) eigentlich egal. Hab grad in die DB geschaut. Stimmt, die beiden ID´s sind als Primärschlüssel angelegt - sprich kann also garnicht gehen 😉

Kann ich das irgendwie doch erreichen? Brauch ich unbedingt eine dritte Spalte ID?
Wenn das nicht geht, muss ich mir dann selber eine Klasse/Entity bauen?

Ja das ist auch von mir so gedacht.
Also der eine Sensor zweimal. Oder 2 Stück vom gleichem Sensor.

verwendetes Datenbanksystem: MSSqlLocalDB

Hi,
ich habe ein kleines Problem mit dem EntityFramework (6.x) und einer ManyToMany Relation.
Nehmen wir mal an, ich hab folgendes Model:


    public class Auto
    {
        public int ProduktID { get; set; }
        public string Name { get; set; }

        public ICollection<Sensor> Sensoren { get; private set; }
    }

    public class Sensor
    {
        public int SensorID { get; set; }
        public string Name { get; set; }

        public ICollection<Auto> Autos { get; private set; }
    }

Context:


    public class AutoContext : DbContext
    {
        public DbSet<Auto> Autos { get; set; }
        public DbSet<Sensor> Sensoren { get; set; }

        public AutoContext() : base() { }
        public AutoContext(string connectionstring) : base(connectionstring) { }


        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            modelBuilder.Entity<Auto>()
                .HasMany<Sensor>(X => X.Sensoren)
                .WithMany(x => x.Autos)
                .Map(m =>
               {
                   m.MapLeftKey("AutoID");
                   m.MapRightKey("SensorID");
                   m.ToTable("AutoSensoren");
               });
        }
    }

Jetzt könnte es ja sein, es gibt z.B. einen Sensor mit dem Namen „Digital“, dieser soll im Auto 2x verbaut werden. Wenn ich aber der Liste Sensoren im Auto zweimal den Sensor „Digital“ zuordne, wird er aber beim SaveChanges nur einmal als ManyToMany angelegt.


        public void Main()
        {
            using (AutoContext ctx = new AutoContext())
            {
                var sen = new Sensor() { Name = "Digital" };

                var auto = new Auto();
                auto.Name = "Brum";
                auto.Sensoren.Add(sen);
                auto.Sensoren.Add(sen);

                ctx.Autos.Add(auto);
                ctx.SaveChanges();
            }
        }

Im Debugger wird korrekt angezeigt, dass das Objekt Sensor „Digital“ 2x in der Collection Sensoren ist.
Hab ich einen Denkfehler, oder geht das im EF nicht?
Danke und Gruß

09.11.2016 - 10:13 Uhr

Ein Klassiker 😉


        public static double GetCacheSize()
        {
            return 0;
        }

Ob sich die CacheSize mal ändert - ich bin gepsannt =)

Hi,

ich habe da mal eine Frage bzw. einer Änderung von IntelliSense in VS2015. Ich weiß leider nicht in welcher Version es genau sich geändert hat. Auf der Arbeit arbeite ich noch mit VS2010, privat hab ich mir jetzt VS2015 Community installiert.

Genauer gesagt geht es mir um IntelliSense bei der Eingabe von Strings.

In VS2015 wenn ich folgenden Code-Ausschnitt tippe

Console.WriteLine("

macht VS2015 neuerdings gleich

Console.WriteLine("")

draus. Wenn ich jetzt meinen string fertig geschrieben habe, wie springe ich am schnellsten ans Ende um mit ";" abzuschließen?
Ich finde als ich in VS2010 das " ") " noch selber tippen musste, war ich schneller, als jetzt mit den Pfeiltasten oder mit einer Tastekompination mich ans Ende zu fummeln. Bin ich einfach so ein Gewohnheitstier, dass ich nicht mit zurecht komme? Kann ich das umstellen? Oder gibts sonst einen Trick?

Vielen Dank schon mal.

Ich mach das mit Office Interop...Gibt doch auch .Net Office


using System;
using System.IO;

#region Using Directives
using System;
using CommandLine;
using CommandLine.Text;
#endregion

namespace app_SendMailAttach
{
    class Program
    {
        static void Main(string[] args)
        {
            var options = new Options();
            if (!CommandLine.Parser.Default.ParseArguments(args, options))
            {
                Environment.Exit(CommandLine.Parser.DefaultExitCodeFail);
            }


            Microsoft.Office.Interop.Outlook.NameSpace lo_NSpace;
            Microsoft.Office.Interop.Outlook.MAPIFolder lo_Folder;
            Microsoft.Office.Interop.Outlook.Application lo_OutApp;
            Microsoft.Office.Interop.Outlook.MailItem lo_Item;

            lo_OutApp = new Microsoft.Office.Interop.Outlook.Application();

            lo_NSpace = lo_OutApp.GetNamespace("MAPI");

            lo_Folder = lo_NSpace.GetDefaultFolder(Microsoft.Office.Interop.Outlook.OlDefaultFolders.olFolderSentMail);

            lo_Item = (Microsoft.Office.Interop.Outlook.MailItem)lo_Folder.Items.Add(Microsoft.Office.Interop.Outlook.OlItemType.olMailItem);

            if (options.files != null)
            {
                for (int i = 0; i < options.files.Length; i++)
                {
                    if (!File.Exists(options.files[i])) continue;
                    lo_Item.Attachments.Add(options.files[i]);
                }
            }

            lo_Item.Subject = options.subject;
            lo_Item.To = options.recipient;
            if (!string.IsNullOrEmpty(options.text))
            {
                lo_Item.BodyFormat = Microsoft.Office.Interop.Outlook.OlBodyFormat.olFormatHTML;
                lo_Item.HTMLBody = options.text;
            }
            else
            {
                lo_Item.BodyFormat = Microsoft.Office.Interop.Outlook.OlBodyFormat.olFormatRichText;
            }
            //Wenn man cc oder bcc verschicken will
            //lo_Item.CC = EmailCC;
            //lo_Item.BCC = EmailBCC;
            //wenn man möchte kann man noch Flaggen und Fälligkeit definieren
            //lo_Item.FlagStatus = Microsoft.Office.Interop.Outlook.OlFlagStatus.olFlagMarked;
            //lo_Item.FlagIcon = Microsoft.Office.Interop.Outlook.OlFlagIcon.olRedFlagIcon;
            //lo_Item.FlagDueBy = DateTime.Now.AddDays(7);


            //lo_Item.Body = MailBody;
            //NachrichtenFormat

            //Anzeigen modal
            lo_Item.Display();

            //Senden der Mail
            //lo_Item.Send();

        }
    }
}
28.09.2015 - 13:37 Uhr

Danke! manchmal sieht man den Baum vor lauter Wald nicht 😉

28.09.2015 - 13:14 Uhr

Hi ich habe ein ganz merkwürdiges Verhalten.

Ich prüfe mit einer if-Abfrage die Länge eines Arrays:


                    if (data.Length < index + 2) return 0;
                    return (data[index + 2] + data[index + 1] + data[index + 0]) / 3;

data.Length = 13484600
index = 1348598 + 2 = 13484600

Bei den Werten sollte er eigentlich return 0 zurück geben, aber geht einfach darüber hinweg...!
Macht .NET da einfach nen Rundungsfehler oder Ungenauigkeit?! Habe es jetzt schon auf 2 Rechner getestet.

Anbei noch ein Screenshot, nicht das ihr denkt ich spinne.
Wenn ich ide "≤" Abfragen würde, wär es ja klar...aber so?!

31.08.2015 - 11:17 Uhr

Hi,

für alle Fragen die C# und .Net betreffen bist du hier schon richtig.

Für alles, was mit NX und der API zu tun hat, kann ich dir dieses Forum Cad.de oder diese Seite NX Journaling empfehlen.

Um NX mit NXOpen bzw. Journalen "fernzusteuern" wirst du aber um die Grundlagen von C# nicht herum kommen.

Bevor du dich also an NX versuchst...erstmal C# lernen 😉

Hallo tom-essen,

hast du vielleich ein kurzes Beispiel, wie das ganze funktioniert?
Wäre super!

Hi Th69,

du bist mein persönlicher Held des Tages! die beiden Links haben mir echt weiter geholfen. Das mit dem Stride habe ich nicht gewusst! Danach ist alles etwas klarer!

Vielen Dank nochmal und schönes WE! Auch an die anderen Vielen Dank für die Geduld!

PPS. Du kannst dir auch mal die folgenden beiden Links anschauen:

>


>

(diese verwenden beide korrekterweise den Stride-Parameter - anstatt den Width-Parameter)

Hi,
Vielen Dank für die Antwort. Nein von den Strides hab ich noc nichts gehört.
anbei der Code für die LockBits:


public class LockBitmap
{
    Bitmap source = null;
    IntPtr Iptr = IntPtr.Zero;
    BitmapData bitmapData = null;

    public byte[] Pixels { get; set; }
    public int Depth { get; private set; }
    public int Width { get; private set; }
    public int Height { get; private set; }
    public Bitmap Image { get { return source; } }

    public LockBitmap(Bitmap source)
    {
        this.source = source;
    }

    /// <summary>
    /// Lock bitmap data
    /// </summary>
    public void LockBits()
    {
        try
        {
            // Get width and height of bitmap
            Width = source.Width;
            Height = source.Height;

            // get total locked pixels count
            int PixelCount = Width * Height;

            // Create rectangle to lock
            Rectangle rect = new Rectangle(0, 0, Width, Height);

            // get source bitmap pixel format size
            Depth = System.Drawing.Bitmap.GetPixelFormatSize(source.PixelFormat);

            // Check if bpp (Bits Per Pixel) is 8, 24, or 32
            if (Depth != 8 && Depth != 24 && Depth != 32)
            {
                throw new ArgumentException("Only 8, 24 and 32 bpp images are supported.");
            }

            // Lock bitmap and return bitmap data
            bitmapData = source.LockBits(rect, ImageLockMode.ReadWrite,
                                         source.PixelFormat);

            // create byte array to copy pixel values
            int step = Depth / 8;
            Pixels = new byte[PixelCount * step];
            Iptr = bitmapData.Scan0;

            // Copy data from pointer to array
            Marshal.Copy(Iptr, Pixels, 0, Pixels.Length);
        }
        catch (Exception ex)
        {
            throw ex;
        }
    }

    /// <summary>
    /// Unlock bitmap data
    /// </summary>
    public void UnlockBits()
    {
        try
        {
            // Copy data from byte array to pointer
            Marshal.Copy(Pixels, 0, Iptr, Pixels.Length);

            // Unlock bitmap data
            source.UnlockBits(bitmapData);
        }
        catch (Exception ex)
        {
            throw ex;
        }
    }

    /// <summary>
    /// Get the color of the specified pixel
    /// </summary>
    /// <param name="x"></param>
    /// <param name="y"></param>
    /// <returns></returns>
    public Color GetPixel(int x, int y)
    {
        Color clr = Color.Empty;

        // Get color components count
        int cCount = Depth / 8;

        // Get start index of the specified pixel
        int i = ((y * Width) + x) * cCount;

        if (i > Pixels.Length - cCount)
            throw new IndexOutOfRangeException();

        if (Depth == 32) // For 32 bpp get Red, Green, Blue and Alpha
        {
            byte b = Pixels[i];
            byte g = Pixels[i + 1];
            byte r = Pixels[i + 2];
            byte a = Pixels[i + 3]; // a
            clr = Color.FromArgb(a, r, g, b);
        }
        if (Depth == 24) // For 24 bpp get Red, Green and Blue
        {
            byte b = Pixels[i];
            byte g = Pixels[i + 1];
            byte r = Pixels[i + 2];
            clr = Color.FromArgb(r, g, b);
        }
        if (Depth == 8)
        // For 8 bpp get color value (Red, Green and Blue values are the same)
        {
            byte c = Pixels[i];
            clr = Color.FromArgb(c, c, c);
        }
        return clr;
    }

    /// <summary>
    /// Set the color of the specified pixel
    /// </summary>
    /// <param name="x"></param>
    /// <param name="y"></param>
    /// <param name="color"></param>
    public void SetPixel(int x, int y, Color color)
    {
        // Get color components count
        int cCount = Depth / 8;

        // Get start index of the specified pixel
        int i = ((y * Width) + x) * cCount;

        if (Depth == 32) // For 32 bpp set Red, Green, Blue and Alpha
        {
            Pixels[i] = color.B;
            Pixels[i + 1] = color.G;
            Pixels[i + 2] = color.R;
            Pixels[i + 3] = color.A;
        }
        if (Depth == 24) // For 24 bpp set Red, Green and Blue
        {
            Pixels[i] = color.B;
            Pixels[i + 1] = color.G;
            Pixels[i + 2] = color.R;
        }
        if (Depth == 8)
        // For 8 bpp set color value (Red, Green and Blue values are the same)
        {
            Pixels[i] = color.B;
        }
    }

    public Color GetBlackWhitePixel(int x, int y)
    {
        Color value = GetPixel(x, y);
        int grey = (value.R + value.G + value.B) / 3;
        if (grey > 127) return Color.White;
        else return Color.Black;
    }
}

Kann man hier irgendwie mehr Bilder auf einmal hochladen?

Hallo herbivore,

Danke das du dir es auch nochmal anschaust. Ich habe jetzt mal Vergleichsbilder gemacht. Die Ursprungsbilder wurden von einem PDF mit Ghostscript als jpg umgewandelt.

(D:\pdf\gs\gs9.09\bin>gswin32c.exe -sDEVICE=jpeg -r50 -dBATCH -dNOPAUSE -sOutputFile=D:\pdf\pdf1.jpg D:\pdf\pdf1.pdf)

Wenn ich das Bild über die Funktionen Bitmap.GetPixel() und Bitmap.SetPixel() bearbeite und auslese ist alles so wie gewollt. Wenn ich aber über LockBits gehe, verschiebt er mir alles.
Ich pack mal ein Beispielprojekt mit rein. Die LockBitmap-Klasse ist die, die ich oben schon verlinkt habe.

Ich komm irgendwie nicht weiter. Hab versucht wie Abt das geschrieben hat, das Bitmap zu laden. Leider ohne erfolg

Erklärung der Bilder:
pdf1.jpg -->Ausgangsbild Source
pdf2.jpg -->Ausgangsbild Compare
compare_bitmap.jpg --> So sollte es aussehen (mit GetPixel und SetPixel)
compare_lockbits.jpg --> So sieht es mit LockBits aus...

LockBits brauch ich wegen der Performance.

Vielen Dank an alle!

Nein Abt, sorry. Schau ich mir gerade an das Thema. Ich wollte nur Christian drauf hinweisen, das ich bereits erklärt habe wo die Bilder herkommen die ich laden will.

Ich will keinen Verärgern. Vielen Dank für die Hilfe! Ich werd mich mal einlesen.

Hi,

nochmal ich hab das Bitmap mit verschiedenen Programmen erstellt. in dem Fall wie oben geschrieben mit Adobe Photoshop CS 2. Datei Speichern unter BMP und die verschiedenen Farbtiefen ausgewählt...ich versuch sie doch nur zu laden...

Das tolle ist aber das:

Bild: Ausgabe:
16 --> 32
24 --> 24
32 --> 24

Das gibt doch überhaupt keinen Sinn!
*grml*

Hier nochmal ein Bild zur Verdäutlichung:
Ich hab das Bild mit 16 Bit (Wird auch im Explorer angezeigt) eingelesen. Im .Net bekomm ich aber die Anzeige 32 Bit?! Deswegen komm ich dann auch mit den LockBits-Funktion nicht richtig zu Rande.

Das Grundproblem ist, dass ich nicht die richtige Farbtiefe bekomme

Hallo Christian,

ich habe geschrieben, dass ich bereits eine Vermutung für den Fehler hab. Deswegen hab ich einen Code eingestellt der die Farbtiefe aus Bilder ausließt und hab dazu Testbilder gepackt.

Die Dateinamen heißen so, mit welcher Farbtiefe das Bild gespeichert wurde. Wenn ich mir die Farbtiefe im Explorer anzeigen lassen passt diese. Wenn ich sie mir über .Net mit der obenen genannten Funktion ausgeben lassen, stimmt diese nicht überein. z.B. Bild hat 16 Bit Farbtiefe, Ausgabe 8 Bit

Sorry wenn das ganze unverständlich war...

Screenshot (Sorry, bekam eine Fehlermeldung beim Hochladen...)

Hi,

ich bin grad völligst am verzweifeln. Ich verwende von Codeproject (Fast Bitmaps) diese Klasse um ein Bild zu erstellen und bearbeiten.

Problem ist, das es mir das ganze Bild verzerrt. siehe Screenshot.
Ich hab jetzt rausbekommen das es wohl an der falsch gelesen Farbtiefe liegt.
Ich hab mal ein Testprogramm gemacht:


		public static void Main(string[] args)
		{
			Bitmap bmp = (Bitmap)Image.FromFile(@"C:\_trash\pdfdiff\t_24bit.bmp");
			
			Console.WriteLine(Bitmap.GetPixelFormatSize(bmp.PixelFormat));
			
			Console.ReadKey(true);
		}

Dieser gibt mir dann schon die falsche Farbtiefe aus. Im Windows Explorer Eigenschaften-Fenster steht die Richtige.
Anbei noch die Testbilder (in Photoshop CS2 gespeichert). Das absolut noch dubiosere ist, dass wenn ich ein PDF im Acrobat mit speichern unter "JPG" mache, das Tool ohne Probleme funktioniert. Aber alle anderen Bilder (getestet Ghostscript, Photoshop, Paint) Probleme machen.

Dateiformat ist auch egal (PNG, BMP, JPG).

Ich weiss leider echt nicht mehr weiter. Hat jemand schon mal ein ähnliches Problem gehabt?

Vielen Dank

Hallo ihr,

wir würden gern von unserem Unternehmen eine "Karte" anlegen, wo alle IT-System (im speziellen Drucker) eingezeichnet sind. Wir haben öfters den Fall, wo bei uns Notebook Nutzer in einem Besprechungszimmer sitzen und den nächsten Drucker suchen.

Gibt es ein Tool wo ich eine "Karte" erstellen kann und die vielleicht sogar im Idealfall auf eine Webseite veröffentlichen kann?! Evtl. ein Flash Element durch das der Nutzer durchscrollen kann...?

Hat jemand sowas schon mal realisiert?

Gruß und Danke für die Tipps.

Hi, so mach ich das....


        /// <summary>
        /// Öffnet die angegeben Datei, mit dem "Öffnen mit"-Dialog
        /// </summary>
        /// <param name="filepath">Pfad zur Datei</param>
        private static void OpenFileWith(string filepath)
        {
            try
            {
                Process.Start("rundll32.exe", "shell32.dll, OpenAs_RunDLL " + filepath);
            }
            catch (Exception ex)
            {
                _log.Error(ex);
                MessageBox.Show(ex.Message);
            }
        }


15.01.2014 - 16:09 Uhr

Hey,

arbeitest du vielleicht mit einer englischen Version von Visual Studio. Kann es evtl sein, dass du die Spracherkennung erst auf Deutsch stellen musst?
Da könnte ich mir vorstellen das es hackt.

Ich mache bei Windows Phone auch Texterkennung und da funktioniert das auch "geil" und "prima" 😉

Ja wenn man nicht immer so in Hektik wäre 😉 Vielen Dank dir!!

Hi,

hab den Fehler endlich gefunden.

Java liest und schreibt im Big-Endian-Encoding und .Net im little-endian-Encoding.

Siehe hier einen Wrapper-Klasse und die Erklärung

Stackoverflow

Hallo Ihr,
ich hab da eine Frage in Richtung Socket-Programmierung. Es gibt im Internet verschiedene Scripts wie ich von einer Wärmepumpe (Luxtronic 2) die Werte über Socket auslese. Da diese alle in Java geschrieben sind, wollte ich das ganze in .Net ummodeln. Soweit so gut….
In Java wird eine Verbindung mit den Socket hergestellt. Das ist ja in .Net fast analog.
Jetzt kommen wir zum senden vom Request…
In Java geht das so:

dataout.writeInt(3004);      (dataout ist vom Type DataOutputStream)

in der Java Doku steht folgendes dazu:

“Writes an int to the underlying output stream as four bytes, high byte first. If no exception is thrown, the counter written is incremented by 4.”

JavaDocu
Das ganze hab ich im C# dann auch so gemacht.

NetworkStream netstream = new NetworkStream(tempSocket);
            BinaryWriter writer = new BinaryWriter(netstream, Encoding.BigEndianUnicode);
            writer.Write((int)3304);
            writer.Flush();

Da das Ganze nicht funktioniert hat, hab ich mir über Wireshark mal anzeigen lassen was den überhaupt genau übertragen wird.
Bei der Java Geschichte werden nicht 4 Bytes übertragen sondern 7 Bytes:
00:0b:bc:00:00:00:00
Im C# aber wirklich die 4 Bytes wie angenommen.
Jetzt habe ich manuell den C# Code umgebaut:

            netstream.WriteByte((byte)0);
            netstream.WriteByte((byte)0);
            netstream.WriteByte((byte)11);
            netstream.WriteByte((byte)188);
            netstream.WriteByte((byte)0);
            netstream.WriteByte((byte)0);
            netstream.WriteByte((byte)0);

Und somit mir das ganze was Java wirklich überträgt nachgebaut. Und sie da es funktioniert.
Aber wieso ist das so? Sollten Sockets nicht gleich sein. Habe ich was übersehen?
Kennt sich hier zufällig mit Java auch so gut aus, mir das zu beantworten? Vielen Dank im voraus…