Software-OK
≡... News | ... Home | ... FAQ | Impressum | Kontakt | Gelistet bei | Danke |

  
HOME ► Faq ► FAQ - Windows-CPP-und-C ► ««« »»»

RGB-Pixel zu Negativ in CPP oder C ohne externe Bibliotheken!


Hier die Lösung um einen RGB Pixel zum Negativem RGB PIXEL zu machen und ein kleines Beispiel mit Quellcode um es zu verdeutlichen!



Inhalt:

1.) ... RGB Pixel zum Negativem RGB PIXEL!
2.) ... Kleines Beispielprogramm um es besser zu Verstehen!
3.) ... Komplexes Beispiel mit Bitmap für Fortgeschrittene C Programmierer!

1.) RGB Pixel zum Negativem RGB PIXEL!

BYTE R=255-R;
BYTE G=255-G;
BYTE B=255-B;

Oder bei Grau Skalierung 
BYTE Grauwert = 255-Grauwert

Was ist RGB, RGBA, ABGR, ARGB (Beispiel, Unterschied)?

2.) Kleines Beispielprogramm um es besser zu Verstehen!


Hier ist der Code mit einer Funktion für die Grauskalierung und zusätzlichen Kommentaren:

#include <stdio.h>
 
// Struktur für RGB-Farbwerte
struct RGB {
    unsigned char red;
    unsigned char green;
    unsigned char blue;
};
 
// Struktur für RGBA-Farbwerte
struct RGBA {
    unsigned char red;
    unsigned char green;
    unsigned char blue;
    unsigned char alpha;
};
 
// Funktion zum Invertieren der RGB-Werte
void negateRGB(struct RGB *color) {
    color->red   = 255 - color->red;
    color->green = 255 - color->green;
    color->blue  = 255 - color->blue;
}
 
// Funktion zum Invertieren der RGBA-Werte
void negateRGBA(struct RGBA *color) {
    color->red   = 255 - color->red;
    color->green = 255 - color->green;
    color->blue  = 255 - color->blue;
    color->alpha = 255 - color->alpha;
}
 
// Funktion zur Grauskalierung der RGB-Werte
void grayscaleRGB(struct RGB *color) {
    // Der Grauwert wird als Durchschnitt der RGB-Werte berechnet
    unsigned char gray = (color->red + color->green + color->blue) / 3;
    color->red = gray;
    color->green = gray;
    color->blue = gray;
}
 
// Funktion zur Grauskalierung der RGBA-Werte (ignoriert den Alpha-Kanal)
void grayscaleRGBA(struct RGBA *color) {
    // Der Grauwert wird als Durchschnitt der RGB-Werte berechnet
    unsigned char gray = (color->red + color->green + color->blue) / 3;
    color->red = gray;
    color->green = gray;
    color->blue = gray;
}
 
int main()
{
    // Beispiel für RGB
    struct RGB meineFarbe = {100, 150, 200};
 
    printf("Ursprüngliche RGB-Werte: R=%d, G=%d, B=%d\n", meineFarbe.red, meineFarbe.green, meineFarbe.blue);
 
    negateRGB(&meineFarbe);
 
    printf("Invertierte RGB-Werte: R=%d, G=%d, B=%d\n", meineFarbe.red, meineFarbe.green, meineFarbe.blue);
 
    // Grauskalierung für RGB
    grayscaleRGB(&meineFarbe);
 
    printf("Grauskalierte RGB-Werte: R=%d, G=%d, B=%d\n", meineFarbe.red, meineFarbe.green, meineFarbe.blue);
 
    // Beispiel für RGBA
    struct RGBA meineFarbeMitAlpha = {100, 150, 200, 50};
 
    printf("\nUrsprüngliche RGBA-Werte: R=%d, G=%d, B=%d, A=%d\n", meineFarbeMitAlpha.red, meineFarbeMitAlpha.green, meineFarbeMitAlpha.blue, meineFarbeMitAlpha.alpha);
 
    negateRGBA(&meineFarbeMitAlpha);
 
    printf("Invertierte RGBA-Werte: R=%d, G=%d, B=%d, A=%d\n", meineFarbeMitAlpha.red, meineFarbeMitAlpha.green, meineFarbeMitAlpha.blue, meineFarbeMitAlpha.alpha);
 
    // Grauskalierung für RGBA
    grayscaleRGBA(&meineFarbeMitAlpha);
 
    printf("Grauskalierte RGBA-Werte: R=%d, G=%d, B=%d, A=%d\n", meineFarbeMitAlpha.red, meineFarbeMitAlpha.green, meineFarbeMitAlpha.blue, meineFarbeMitAlpha.alpha);
 
    return 0;
}<<
 
 

Die Funktionen `grayscaleRGB` und `grayscaleRGBA` wurden hinzugefügt, um die RGB- bzw. RGBA-Werte in Graustufen umzuwandeln. Beachte, dass die Grauskalierung einfach als Durchschnitt der RGB-Werte berechnet wurde. Die Kommentare im Code sollten helfen, die verschiedenen Teile des Codes zu verstehen.

3.) Komplexes Beispiel mit Bitmap für Fortgeschrittene C Programmierer!



Wenn Sie ohne externe Bibliotheken arbeiten möchten, können Sie ein einfaches C-Programm schreiben, um ein Bild im BMP-Format zu invertieren. Hier ist ein Beispielcode:

 
 
#include <stdio.h>
#include <stdlib.h>
 
// BMP-Header-Struktur
#pragma pack(push, 1)
 
struct BMPHeader {
  char signature[2];
        // BMP-Signatur "BM"
  unsigned int fileSize;
        // Gesamtgröße der BMP-Datei
  unsigned short reserved1;
        // Reservierter Bereich, muss auf 0 gesetzt sein
  unsigned short reserved2;
        // Reservierter Bereich, muss auf 0 gesetzt sein
  unsigned int dataOffset;
        // Offset, an dem die Bilddaten in der Datei beginnen
};
 
struct DIBHeader {
  unsigned int headerSize;
        // Größe des DIB-Headers (40 Bytes für Windows-BMP)
  int width;
        // Breite des Bildes in Pixeln
  int height;
        // Höhe des Bildes in Pixeln
  unsigned short planes;
        // Anzahl der Farbebenen (muss 1 sein)
  unsigned short bitsPerPixel;
        // Anzahl der Bits pro Pixel (hier 24 für 8 Bit pro Farbkanal)
  unsigned int compression;
        // Kompressionsmethode (hier keine Kompression)
  unsigned int imageSize;
        // Größe der Bilddaten in Bytes
  int xPixelsPerMeter;
        // Anzahl der Pixel pro Meter in der horizontalen Richtung
  int yPixelsPerMeter;
        // Anzahl der Pixel pro Meter in der vertikalen Richtung
  unsigned int colorsUsed;
        // Anzahl der Farben in der Farbpalette (hier nicht relevant)
  unsigned int colorsImportant;
        // Anzahl der wichtigen Farben (hier nicht relevant)
};
 
#pragma pack(pop)
 
// RGB-Struktur für ein Pixel
struct RGB {
  unsigned char blue; // Blauanteil des Pixels
  unsigned char green;  // Grünanteil des Pixels
  unsigned char red;  // Rotanteil des Pixels
};
 
// Funktion zum Invertieren eines Bildes
void invertImage(struct RGB* image, int width, int height) {
  for (int i = 0; i < width * height; ++i) {
// Jeder Farbkanal des Pixels wird invertiert, Subtraktion von der maximalen Farbwert
    image[i].red = 255 - image[i].red;
    image[i].green = 255 - image[i].green;
    image[i].blue = 255 - image[i].blue;
  }
}
 
int main() {
  FILE* inputFile = fopen("input.bmp", "rb");
  FILE* outputFile = fopen("output.bmp", "wb");
 
  if (!inputFile || !outputFile) {
    fprintf(stderr, "Fehler beim Öffnen der Dateien!\n");
    return 1;
  }
 
  // Lesen Sie den BMP-Header
  struct BMPHeader bmpHeader;
  fread(&bmpHeader, sizeof(struct BMPHeader), 1, inputFile);
 
  // Überprüfen Sie die BMP-Signatur
  if (bmpHeader.signature[0] != 'B' || bmpHeader.signature[1] != 'M') {
    fprintf(stderr, "Ungültige BMP-Datei!\n");
    fclose(inputFile);
    fclose(outputFile);
    return 1;
  }
 
  // Lesen Sie den DIB-Header
  struct DIBHeader dibHeader;
  fread(&dibHeader, sizeof(struct DIBHeader), 1, inputFile);
 
  // Überprüfen Sie die Unterstützung für 24-Bit-Bilder
  if (dibHeader.bitsPerPixel != 24) {
    fprintf(stderr, "Nur 24-Bit-BMP-Dateien werden unterstützt!\n");
    fclose(inputFile);
    fclose(outputFile);
    return 1;
  }
 
  // Lesen Sie die Bilddaten
  struct RGB* imageData = (struct RGB*)malloc(dibHeader.imageSize);
 
  fread(imageData, dibHeader.imageSize, 1, inputFile);
 
  // Invertieren Sie das Bild
  invertImage(imageData, dibHeader.width, dibHeader.height);
 
  // Schreiben Sie das invertierte Bild zurück in die Ausgabedatei
  fwrite(&bmpHeader, sizeof(struct BMPHeader), 1, outputFile);
 
  fwrite(&dibHeader, sizeof(struct DIBHeader), 1, outputFile);
 
  fwrite(imageData, dibHeader.imageSize, 1, outputFile);
 
  // Aufräumen
 
  fclose(inputFile);
 
  fclose(outputFile);
 
  free(imageData);
 
  printf("Bild erfolgreich invertiert und in 'output.bmp' gespeichert.\n");
 
  return 0;
}
 
 

Dieser Code unterstützt 24-Bit-BMP. Beachten Sie, dass die Invertierung des Alpha-Kanals optional ist und nach Bedarf hinzugefügt oder entfernt werden kann.

Mit diesem aktualisierten Code wird das invertierte Bild in "output.bmp" gespeichert. Stellen Sie sicher, dass Sie das Originalbild als "input.bmp" im gleichen Verzeichnis wie das Programm haben.

FAQ 5: Aktualisiert am: 27 November 2023 21:34 Windows
Windows-CPP-und-C

Wurde mit Code -1073741701 (0xc000007b) Fehlermeldung!


Die Lösung ist denkbar einfach um den Fehlercode: "wurde mit Code -1073741701 0xc000007b Fehlermeldung beendet" zu beheben Es handelt sich zumeist bei
Windows-CPP-und-C

ListView_GetItemImage, ListView_GetISubtemImage!


Die Lösung ist denkbar einfach um im ListView Get Item Image und List View GetI Subtem Image, herauszufinden
Windows-CPP-und-C

ShellExecuteEx Funktion, Suche LPCITEMIDLIST!


Die Lösung ist denkbar einfach um mit der ShellExecuteEx Funktion, Suche nach LPCITEMIDLIST zu starten The provided code defines a function called SearchCmdLPCITEMIDLIST,
Windows-CPP-und-C

Listenansicht Miniaturansichten Größe festlegen!


Recht schnell kann man in der Listenansicht die Miniaturansichten Größe festlegen, bei der Größe gibt es auch keine Einschränkungen Dieses Beispiel demonstriert
Windows-CPP-und-C

Virtuellen Arbeitsspeicher reservieren C++, Windows?


Die Lösung ist denkbar einfach, wenn man virtuellen Arbeitsspeicher mit C++ unter Windows reservieren will  Inhalt: 1. Der Programm Befehl virtuellen
Windows-CPP-und-C

Was ist der Unterschied zwischen Float und Double?


Es gibt wesentliche Unterschiede zwischen float und double, obwohl beide Gleitkommazahlen sind   Inhalt: 1. Der Unterschied zwischen Float und Double
Windows-CPP-und-C

Unterschied IExtractImage2 und IExtractImage?


Sie möchten IExtractImage oder IExtractImage2 implementieren und es als eine Windows Shell Erweiterung registrieren Implementieren Sie einfach IExtractImage2,

»»

  Meine Frage ist leider nicht dabei
Gestellte Fragen zu dieser Antwort:
Keywords: windows, rgb-pixel, negativ, ohne, externe, bibliotheken, hier, lösung, einen, pixel, negativem, machen, byte, 255-r, 255-g, 255-b, grau, skalierung, grauwert, Fragen, Antworten, Software




  

  + Freeware
  + Ordnung am PC
  + Dateiverwaltung
  + Automatisierung
  + Office Tools
  + PC-Test-Tools
  + Deko und Spaß
  + Desktop-Uhren
  + Security

  + SoftwareOK Pages
  + Micro Staff
  + Freeware-1
  + Freeware-2
  + Freeware-3
  + FAQ
  + Downloads

  + Top
  + Desktop-OK
  + The Quad Explorer
  + Don't Sleep
  + Win-Scan-2-PDF
  + Quick-Text-Past
  + Print Folder Tree
  + Find Same Images
  + Experience-Index-OK
  + Font-View-OK


  + Freeware
  + AutoHideDesktopIcons
  + IsMyTouchScreenOK
  + ExperienceIndexOK
  + AlwaysMouseWheel
  + StressMyPC
  + ClassicDesktopClock
  + AutoPowerOptionsOK
  + MultiClipBoardSlots
  + SicherLoeschen
  + PAD-s


Home | Danke | Kontakt | Link | FAQ | Settings | Windows 2015 | eBlog | English-AV | Impressum | Translate | PayPal | PAD-s

 © 2025 by Nenad Hrg softwareok.de • softwareok.de • softwareok.com • softwareok.eu
34.832 msec.


>> ☕ Kaufe SoftwareOK einen Kaffee ☕ <<



► Ist bei der Ruhezustand- und Herunterfahren-Blockierung der Ressourcen Verbrauch hoch? ◄
► Bildschirmaufzeichnung Cursor versteckt, Video wiedergeben ist der Mauszeiger sichtbar? ◄
► Was ist personalisierte Werbung? ◄
► Ist kinokiste.to illegal oder legal? ◄


Diese Webseite speichert keine personenbezogenen Daten. Allerdings werden Drittanbieter verwendet, um Werbung zu schalten.
Diese wird von Google verwaltet und entspricht dem IAB Transparency and Consent Framework (IAB-TCF).
Die CMP-ID lautet 300 und kann am Seitenende individuell angepasst werden.
mehr Infos & Datenschutz

....