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-FarbwertestructRGB{unsignedcharred;unsignedchargreen;unsignedcharblue;};// Struktur für RGBA-FarbwertestructRGBA{unsignedcharred;unsignedchargreen;unsignedcharblue;unsignedcharalpha;};// Funktion zum Invertieren der RGB-WertevoidnegateRGB(structRGB*color){color->red=255-color->red;color->green=255-color->green;color->blue=255-color->blue;}// Funktion zum Invertieren der RGBA-WertevoidnegateRGBA(structRGBA*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-WertevoidgrayscaleRGB(structRGB*color){// Der Grauwert wird als Durchschnitt der RGB-Werte berechnetunsignedchargray=(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)voidgrayscaleRGBA(structRGBA*color){// Der Grauwert wird als Durchschnitt der RGB-Werte berechnetunsignedchargray=(color->red+color->green+color->blue)/3;color->red=gray;color->green=gray;color->blue=gray;}intmain(){// Beispiel für RGBstructRGBmeineFarbe={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 RGBgrayscaleRGB(&meineFarbe);printf("Grauskalierte RGB-Werte: R=%d, G=%d, B=%d\n",meineFarbe.red,meineFarbe.green,meineFarbe.blue);// Beispiel für RGBAstructRGBAmeineFarbeMitAlpha={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 RGBAgrayscaleRGBA(&meineFarbeMitAlpha);printf("Grauskalierte RGBA-Werte: R=%d, G=%d, B=%d, A=%d\n",meineFarbeMitAlpha.red,meineFarbeMitAlpha.green,meineFarbeMitAlpha.blue,meineFarbeMitAlpha.alpha);return0;}<<
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)structBMPHeader{charsignature[2];// BMP-Signatur "BM"unsignedintfileSize;// Gesamtgröße der BMP-Dateiunsignedshortreserved1;// Reservierter Bereich, muss auf 0 gesetzt seinunsignedshortreserved2;// Reservierter Bereich, muss auf 0 gesetzt seinunsignedintdataOffset;// Offset, an dem die Bilddaten in der Datei beginnen};structDIBHeader{unsignedintheaderSize;// Größe des DIB-Headers (40 Bytes für Windows-BMP)intwidth;// Breite des Bildes in Pixelnintheight;// Höhe des Bildes in Pixelnunsignedshortplanes;// Anzahl der Farbebenen (muss 1 sein)unsignedshortbitsPerPixel;// Anzahl der Bits pro Pixel (hier 24 für 8 Bit pro Farbkanal)unsignedintcompression;// Kompressionsmethode (hier keine Kompression)unsignedintimageSize;// Größe der Bilddaten in BytesintxPixelsPerMeter;// Anzahl der Pixel pro Meter in der horizontalen RichtungintyPixelsPerMeter;// Anzahl der Pixel pro Meter in der vertikalen RichtungunsignedintcolorsUsed;// Anzahl der Farben in der Farbpalette (hier nicht relevant)unsignedintcolorsImportant;// Anzahl der wichtigen Farben (hier nicht relevant)};#pragma pack(pop)// RGB-Struktur für ein PixelstructRGB{unsignedcharblue;// Blauanteil des Pixelsunsignedchargreen;// Grünanteil des Pixelsunsignedcharred;// Rotanteil des Pixels};// Funktion zum Invertieren eines BildesvoidinvertImage(structRGB*image,intwidth,intheight){for(inti=0;i<width*height;++i){// Jeder Farbkanal des Pixels wird invertiert, Subtraktion von der maximalen Farbwertimage[i].red=255-image[i].red;image[i].green=255-image[i].green;image[i].blue=255-image[i].blue;}}intmain(){FILE*inputFile=fopen("input.bmp","rb");FILE*outputFile=fopen("output.bmp","wb");if(!inputFile||!outputFile){fprintf(stderr,"Fehler beim Öffnen der Dateien!\n");return1;}// Lesen Sie den BMP-HeaderstructBMPHeaderbmpHeader;fread(&bmpHeader,sizeof(structBMPHeader),1,inputFile);// Überprüfen Sie die BMP-Signaturif(bmpHeader.signature[0]!='B'||bmpHeader.signature[1]!='M'){fprintf(stderr,"Ungültige BMP-Datei!\n");fclose(inputFile);fclose(outputFile);return1;}// Lesen Sie den DIB-HeaderstructDIBHeaderdibHeader;fread(&dibHeader,sizeof(structDIBHeader),1,inputFile);// Überprüfen Sie die Unterstützung für 24-Bit-Bilderif(dibHeader.bitsPerPixel!=24){fprintf(stderr,"Nur 24-Bit-BMP-Dateien werden unterstützt!\n");fclose(inputFile);fclose(outputFile);return1;}// Lesen Sie die BilddatenstructRGB*imageData=(structRGB*)malloc(dibHeader.imageSize);fread(imageData,dibHeader.imageSize,1,inputFile);// Invertieren Sie das BildinvertImage(imageData,dibHeader.width,dibHeader.height);// Schreiben Sie das invertierte Bild zurück in die Ausgabedateifwrite(&bmpHeader,sizeof(structBMPHeader),1,outputFile);fwrite(&dibHeader,sizeof(structDIBHeader),1,outputFile);fwrite(imageData,dibHeader.imageSize,1,outputFile);// Aufräumenfclose(inputFile);fclose(outputFile);free(imageData);printf("Bild erfolgreich invertiert und in 'output.bmp' gespeichert.\n");return0;}
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:34Windows
Die Lösung ist denkbar einfach um mit der ShellExecuteEx Funktion, Suche nach LPCITEMIDLIST zu starten The provided code defines a function called SearchCmdLPCITEMIDLIST,
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
Sie möchten IExtractImage oder IExtractImage2 implementieren und es als eine Windows Shell Erweiterung registrieren Implementieren Sie einfach IExtractImage2,
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 ....