Bilddaten
-
Noch als kleine Info Rose, es ist vollkommen egal was in der Datei steht. Wichtig ist nur, dass die Dateien im Binärmodus gelesen/geschrieben.
-
@Herrmann:
Ich habe noch zwei Fragen bezüglich Deines Quellcodes, bzw. Erweiterungsfragen:- Fragestellung: Ich möchte ein Bild einlesen, eine in einer Bibliothek definierten Funktion mit dem Bild durchführen und diese Ergebnisse in eine Datei schreiben. An welcher Stelle rufe ich die Funktion auf?
So wie unten funktioniert es leider nicht:
while ( ( iRead = fread( cBf, sizeof( char ), COPY_BFSIZE, pSrcFd ) ) > 0)
cmsDoTransform(hTransform,cBf,pDstFd,iRead);
/* Gelesenen Block in die Zieldatei schreiben */
fwrite( cBf, sizeof( char ), iRead, pDstFd );Die Funktion: cmsDoTransform ist eine extern definierte Funktion, die Bibliothek habe ich eingebunden
Wenn ich versuche, eine for-Schleife einzubauen, wird es leider auch nix. Hast Du da eine Lösung? Der Fehler ist, dass ich immer eine leere Datei erhalte. Beim Kompilieren und Ausführen erhalte ich sonst keine Meldungen.
- Wie lese ich einzelne Zeilen eines Bildes ein??
Danke schon mal,
Rose
- Fragestellung: Ich möchte ein Bild einlesen, eine in einer Bibliothek definierten Funktion mit dem Bild durchführen und diese Ergebnisse in eine Datei schreiben. An welcher Stelle rufe ich die Funktion auf?
-
@Rose,
wenn dein Code wirklich so aussieht, kann es nicht funktionieren.... while ( ( iRead = fread( cBf, sizeof( char ), COPY_BFSIZE, pSrcFd ) ) > 0) { /* Klammer vergessen */ cmsDoTransform(hTransform,cBf,pDstFd,iRead); fwrite( cBf, sizeof( char ), iRead, pDstFd ); }; /* und hier genauso */ ...
Wenn mehr als eine Anweisung in einer Schleife ist, müssen diese in geschweiften Klammern eingeschlossen werden --> siehe C/C++ Buch
Der zweite Punkt ist nicht so einfach zu realisieren. Je nachdem was für eine Grafikformat du verwendest, sind die Daten darin anders abgelegt. Weiterhin musst du den Header jeder Grafikdatei beachten. Bitmaps sind warscheinlich am einfachsten. Eine Headerbeschreibung findest du hier:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/gdi/bitmaps_7c36.asp
-
Hilfe!!!
Ich habe die Klammern nun angewandt und es geht trotzdem nicht:
Ich kopiere Dir jetzt mal den gesamten Code: Die Fehlermeldung erscheint beim Ausführen und besagt, dass Vorgang xxx auf Speicher in yyy weist. Die Anweisung written konnte nicht auf dem Speicher durchgeführt werden.
Ich bin sicher, Du siehst auf Anhieb, was da falsch ist!!!
Ich vertiefe mich nun mal in mein C-Buch aus der Bücherei
1000 Dank schon mal,
Rose#include <stdio.h>
#include "lcms.h"
/*#include <stack>
#include <stdlib.h>
*/int main(void)
{#define COPY_BFSIZE 1024
cmsHPROFILE hInProfile, hOutProfile;
cmsHTRANSFORM hTransform;char cBf[COPY_BFSIZE];
size_t iRead;hInProfile = cmsOpenProfileFromFile("c:\\CIERGB.ICC","r");
hOutProfile = cmsOpenProfileFromFile("c:\\AppleRGB.ICC","r");hTransform = cmsCreateTransform(hInProfile,
TYPE_BGR_8,
hOutProfile,
TYPE_BGR_8,
INTENT_PERCEPTUAL, 0);FILE *pSrcFd;
const char *pSrcFn="c:\\Düne.bmp";FILE *pDstFd;
const char *pDstFn="c:\\Düne2.bmp";/* Eingabe abpruefen */
if ( !pDstFn || !pSrcFn )
return 0;/* Quelldatei oeffnen */
pSrcFd = fopen( pSrcFn, "rb" );
if ( pSrcFd )
{
/* Zieldatei oeffnen */
pDstFd = fopen( pDstFn, "wb" );
if ( pDstFd ){
/* Block von Quelldatei in cBf lesen */
while ( ( iRead = fread( cBf, sizeof( char ), COPY_BFSIZE, pSrcFd ) ) > 0)
{
cmsDoTransform(hTransform,cBf,pDstFd,iRead);
/* Gelesenen Block in die Zieldatei schreiben */
fwrite( cBf, sizeof( char ), iRead, pDstFd );
};/* Dateien schliessen */
fclose( pSrcFd );
fclose( pDstFd );
return 1;
};
/* Quelldatei schliessen */
fclose( pSrcFd );
};return 0;
};
-
@Rose,
der Fehler besagt, dass du auf Speicher zugreifst welcher dir nicht gehört. Es wäre super wenn du sagen könntest bei welcher Quellcode-Zeile der Fehler auftritt.
Ich gehe jetzt mal davon aus, dass du mit einer Entwicklungsumgebung mit Debugger arbeitest. Dann kannst du ja mal deinen Code Zeilenweise-Debuggen um die Stelle des Fehlers zu finden.Laufzeitfehler kann man ohne Testen schlecht finden bzw. nachvollziehen.
-
@Herrmann, beim Debuggen erscheint der Fehler in der Zeile
fwrite( cBf, sizeof( char ), iRead, pDstFd );
};,und zwar, nachdem die Bedingung 3-4 mal durchlaufen wurde. Fehlermeldung lautet: Access-Violation.
Zur Info: Meine Bitmap-Datei ist 236 kB groß.
Verstehe ich nicht . . .Du?
Danke,
Rose
-
@Rose,
ich würde jetzt mal darauf tippen, dass die Funktion cmsDoTransform der Übeltäter ist. Kommentier mal den cmsDoTransform-Aufruf aus und mache dann mal einen Testlauf. Sollte es nicht an der Funktion liegen, müssen wir weiter raten
-
Wenn ich die Funktion "cmsDoTransform" auskommentiere, erhalte ich nicht mehr diese Fehlermeldung, leider wird die Funktion, die cmsDo Trannsform enthält, logischerweise nicht ausgeführt. Ich werde mir die API-Referenz noch mal ansehen, was den diese Funktion für Parameter braucht. Oder fällt Dir auf Anhieb was ein?
Frage: Du schriebst, ich würde eventl. auf Speicher zugreifen, der mir nicht gehört.Die Fehlermeldung Access Violation deutet ja auch daraufhin. Was meinst Du (und die Fehlermeldung) damit?
VG+Danke,
Rose
-
Hallo, ich weiß zwar nicht was die Funktion macht da ich sie in der MSDN nicht finde. Bist du sicher, dass es eine API-Funktion ist? Du kannst aber mal was ausprobieren. Kommentier den Funktionsaufruf wieder ein und schau die die übergebenen Parameter vor und nach diesem Funktionsaufruf an.
PS: Access Violation:
/* Dein Programm reserviert damit Speicher für 10 char-Elemente*/ char cChars[10]; /* Wenn du nun versuchst auf das 11. Element zuzugreifen, greifst du logischerweise auf Speicher zu, der deinem Programm nicht gehört oder zu überschreibst eigene Elemente. */ cChars[10] = 'x';
-
@Herrmann,
ich probiere zu Studienzwecken aus, in C ein frei verfügbares Color Management System (CMS) zu adressieren und Bilder im Farbmodus zu verändern. Diese CMS beeinhaltet eine API und demnach auch eine API-Referenz, in der ich nachgesehen habe, welche Parameter übergeben werden müssen.
Werde Deinen Tipp gleich ausprobieren,
Danke, bis dahin,
Kerstin