Visual Basic 2010 Express Fabe von Transparentes Bild ändern

  • VB.NET

Es gibt 21 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    Visual Basic 2010 Express Fabe von Transparentes Bild ändern

    hey community

    ich habe mit gimp ein einfarbiges Bild gemacht was etwas Transparent ist. Doch jetzt möchte ich es so machen, das der Benutzer die Farbe des Bildes Färben kann doch die Transparenz soll erhalten bleiben!

    wie geht das? Oder besser gesagt: Geht das überhaupt?

    danke im vorraus!
    Wenn ich dir auf irgendeiner Art und Weise helfen konnte, drück doch bitte den "Hilfreich" Button :thumbup:

    Für VB.NET Entwickler: Option Strict On nicht vergessen!
    Hmm,
    das ist dann ja Bildbearbeitung..d.H. Du müsstest Dir die Pixel des Bildes auslesen um dann die jeweils zu ändernden Farbwerte zu ändern und zurück zu schreiben!
    Dabei kann man auch den Alpha-Kanal, also die Transparenz, berücksichtigen.

    Das Bild dann z.B. mit der Lockbit-Klasse sperren, Pixel durchlaufen und neu setzen, das Bild wieder "un-locken" und das "neue" Bild anzeigen lassen.
    ​Je nach Größe des Bildes empfiehlt sich dann die LockBits-Methode, weil das einfache "getPixel" bei großen Bildern zu langsam sein kann!
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @RodFromGermany
    Naja ich meinte es so ich habe in Gimp ein Transparentes Bild erstellt (naja eine Leiste wo man halt ein bisschen durchschauen kann)
    und der Benutzer soll nur die Farbe von dieser ändern können ohne das die Transparenz verloren geht.
    Ist dies möglich?
    Wenn ich dir auf irgendeiner Art und Weise helfen konnte, drück doch bitte den "Hilfreich" Button :thumbup:

    Für VB.NET Entwickler: Option Strict On nicht vergessen!

    ClonkAndre schrieb:

    der Benutzer soll nur die Farbe von dieser ändern können ohne das die Transparenz verloren geht.
    Mit Gimp oder Deinem Programm?
    Wenn die Transparenz für alle Pixel gleich ist, machst Du das mit dem Code vom dritten Link, wenn der Benutzer fertig ist:

    C#-Quellcode

    1. //Setting the opacity of the image
    2. public static Image SetImgOpacity(Image imgPic, float imgOpac)
    3. {
    4. Bitmap bmpPic = new Bitmap(imgPic.Width, imgPic.Height);
    5. Graphics gfxPic = Graphics.FromImage(bmpPic);
    6. ColorMatrix cmxPic = new ColorMatrix();
    7. cmxPic.Matrix33 = imgOpac;
    8. ImageAttributes iaPic = new ImageAttributes();
    9. iaPic.SetColorMatrix(cmxPic, ColorMatrixFlag.Default, ColorAdjustType.Bitmap);
    10. gfxPic.DrawImage(imgPic, new Rectangle(0, 0, bmpPic.Width, bmpPic.Height), 0, 0, imgPic.Width, imgPic.Height, GraphicsUnit.Pixel, iaPic);
    11. gfxPic.Dispose();
    12. return bmpPic;
    13. }
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Definiere

    ClonkAndre schrieb:

    die Farbe für das Bild
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @RodFromGermany
    Besser gesagt muss die Farbe VON das Bild nur geändert werden nicht "für" sry schreibfehler^^
    Wenn ich dir auf irgendeiner Art und Weise helfen konnte, drück doch bitte den "Hilfreich" Button :thumbup:

    Für VB.NET Entwickler: Option Strict On nicht vergessen!
    Dann definiere

    ClonkAndre schrieb:

    die Farbe VON das Bild
    Was ganz genau wird da geändert?
    Alle Pixel auf Grün?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Das kann man so sagen ich hab ein etwas Transparentes Bild was Grau ist, ist aber halt durchsichtig und ich möchte die Grauen pixel dann z.b. zu Grün ersetzen. DOCH die Transparents soll natürlich erhalten bleiben ;)
    Wenn ich dir auf irgendeiner Art und Weise helfen konnte, drück doch bitte den "Hilfreich" Button :thumbup:

    Für VB.NET Entwickler: Option Strict On nicht vergessen!
    Ich fasse das von mir Verstandene zusammen: Bild, einfarbig grau-transparent. D.h. der Farbteil ist auf Grau gestellt (=> R=G=B), und der Alphakanal ist < 255, sodass man ein einfarbiges, gleichmäßig graues, aber dennoch gleichmäßig teiltransparentes Bild hat. Und nun soll aus durchscheinend grau ein durchscheinend irgendwas werden. Wenn dem so ist, dann wie zuvor in Post#2 beschrieben: Alle Pixel schnappen und deren Farbwerte ändern, während der Transparenzwert erhalten bleibt. Guckst Du auch LockBits-Tutorial. Oder eben jedes einzelne Pixelchen per GetPixel und SetPixel neu setzen.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Das ist korrekt doch wie schnapp ich denn alle Pixel und ändere diese ausser die vom Transparentwert?
    Sorry, mit so etwas hab ich mich bisher noch nicht verfasst.
    Wenn ich dir auf irgendeiner Art und Weise helfen konnte, drück doch bitte den "Hilfreich" Button :thumbup:

    Für VB.NET Entwickler: Option Strict On nicht vergessen!
    Du hast eine Bitmap vorliegen (oder aus nem Image bzw. einer Datei erstellen.) Angenommen, dass Du es grün machen willst, dann für das allererste Pixelchen oben links:

    VB.NET-Quellcode

    1. Dim ColorOfCurrentPixel = BitmapToManipulate.GetPixel(0, 0)
    2. 'ColorOfCurrentPixel.A = Alpha-Wert, also Transparenz; bleibt so; daher ist diese Codezeile auch auskommentiert
    3. ColorOfCurrentPixel.R = 0
    4. ColorOfCurrentPixel.G = 255
    5. ColorOfCurrentPixel.B = 0
    6. BitmapToManipulate.SetPixel(0, 0, ColorOfCurrentPixel)

    Dass der Code ausbaufähig ist, sollte klar sein. Aber es geht nicht um schön oder multifunktionell, sondern um: vom Prinzip her geht's so.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Ok danke für den Code auf jeden fall doch wie kann ich Ihn einsetzen?
    Denn "BitmapToManipulate" wurde nicht deklariert.

    Edit:
    Achja und wenn ich "BitmapToManipulate" ersetze gegen meiner Bitmap dann sind die R, G, B Werte ReadOnly. :/

    Wenn ich dir auf irgendeiner Art und Weise helfen konnte, drück doch bitte den "Hilfreich" Button :thumbup:

    Für VB.NET Entwickler: Option Strict On nicht vergessen!

    VB.NET-Quellcode

    1. Dim BitmapToManipulate As New Bitmap(PfadZuDeinerDatei)


    EDIT:

    ClonkAndre schrieb:

    wenn ich "BitmapToManipulate" ersetze gegen meiner Bitmap dann sind die R, G, B Werte ReadOnly.
    Da ich in Post#13 einer Variablen den Wert von GetPixel zuordne und diese Variable eine Color-Struktur ist, kann ich damit machen, was ich will. Die Kurzform BitmapToManipulate.GetPixel(0, 0).A = 5 geht nicht! Deswegen habe ich auch sowas nicht geschrieben.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „VaporiZed“ ()

    Also ich hab das ganze mal in einer Function gepackt doch da gibt es wieder ein paar Fehler

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Shared Function SetImgColor(ByVal imgPic As Image) 'farben einstellung baue ich noch ein
    2. Dim BitmapToManipulate As New Bitmap(imgPic)
    3. BitmapToManipulate.R = 0
    4. BitmapToManipulate.G = 255
    5. BitmapToManipulate.B = 0
    6. BitmapToManipulate.SetPixel(0, 0, BitmapToManipulate)
    7. Return BitmapToManipulate
    8. End Function



    Also einmal bei den ganzen R, G, B Werten steht einmal: R/G/B ist kein Member von "system.drawing.bitmap".
    und einmal in der 6ten Zeile bei "BitmapToManipulate": Der Wert vom Typ "system.drawing.bitmap" kann nicht in "system.drawing.color" konvertiert werden.

    Wenn ich dir auf irgendeiner Art und Weise helfen konnte, drück doch bitte den "Hilfreich" Button :thumbup:

    Für VB.NET Entwickler: Option Strict On nicht vergessen!
    Du hast das GetPixel aus Post#13, Zeile#1 vergessen.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    So besser?

    VB.NET-Quellcode

    1. Public Shared Function SetImgColor(ByVal imgPic As Image)
    2. Dim BitmapToManipulate As New Bitmap(imgPic)
    3. Dim ColorOfCurrentPixel = BitmapToManipulate.GetPixel(0, 0)
    4. ColorOfCurrentPixel.R = 0
    5. ColorOfCurrentPixel.G = 255
    6. ColorOfCurrentPixel.B = 0
    7. BitmapToManipulate.SetPixel(0, 0, ColorOfCurrentPixel)
    8. Return BitmapToManipulate
    9. End Function



    doch leider steht da das R/G/B Readonly ist.
    Wenn ich dir auf irgendeiner Art und Weise helfen konnte, drück doch bitte den "Hilfreich" Button :thumbup:

    Für VB.NET Entwickler: Option Strict On nicht vergessen!
    Wie gesagt hab noch nie mit so etwas gearbeitet wie kann man den Fehler beheben?
    Das R/G/B ist Readonly steht da

    Final Edit:
    Eeeendlich hab ich es geschafft! Es war garnicht so schewer wie ich gedacht habe hier mal mein Code:

    VB.NET-Quellcode

    1. Dim x As Integer
    2. Dim y As Integer
    3. Dim img As Bitmap = New Bitmap(My.Resources.Taskbar_default1_transparent)
    4. For x = 0 To img.Width - 1
    5. For y = 0 To img.Height - 1
    6. img.SetPixel(x, y, Color.FromArgb(20, 0, 255, 0))
    7. Next
    8. Next
    9. Taskbar_ms1.BackgroundImage = img


    Danke für eure Hilfe

    Wenn ich dir auf irgendeiner Art und Weise helfen konnte, drück doch bitte den "Hilfreich" Button :thumbup:

    Für VB.NET Entwickler: Option Strict On nicht vergessen!

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „ClonkAndre“ ()

    Hm, hast recht, da hatte ich wohl einen Gedankenknick. Aber Du kannst dann eben in Zeile#7 bei FromARGB statt der 20 eben (um den Alpha-Wert des Punktes zu behalten) img.GetPixel(x, y).A verwenden.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.