Hi, i am a final year student doing a project using c++ language. In this project, i have to perform Boolean operation and transfer bitmap to DICOM file. In this program that i have attached the function on reading the DICOM file. When i saved the new DICOM file after performing Boolean operation, the filesize end up 1kb less than the orginal DICOM file (incorrect!) From the ReadDICOM(void), i have to comment out all fwrite statements except for header file. It is to overwrite the original DICOM file. Can you help me solve the problem? thanks. Code: void CLEO_MedivisionView::ReadDICOM(void) { FILE *fp; FILE *ft; errno_t err; char t; char a[5]; //Use for reading 'DICOM' char VR[3]; char UID[30]; //For storing transfer syntax char *String; int i, j, k, iLength, loop; //For general use int ValueLength; float FValueField, maxpix; bool flag; //Flag to indicate continue reading the File Header and data short tag[2]; //Tags for group number and element number short sdata; short pixelval; //Variable to store raw pixel value from image file short SValueLength; short ValueField; long num, position; unsigned long LValueField; unsigned short ReservedField; unsigned long LValue; //Variable to store any long datatype //------------- Code to convert the CString m_File1 to char filename ----------------------- const size_t StringSize = 100; size_t CharactersConverted = 0; char filename[StringSize]; wcstombs_s(&CharactersConverted, filename, m_File1.GetLength()+1, m_File1, _TRUNCATE); // pixelmax = 256; ValueLength = 0; flag = true; //Flag for continuous reading of image data in while loop if ((err = fopen_s(&ft, "kp_ry.dcm", "wb+")) != 0) { printf("Cannot open binary file!"); fclose(ft); } if ((err = fopen_s(&fp, filename, "rb")) != 0) { printf("Cannot open binary file!"); fclose(fp); } else { //-------------------------------- Read Meta-File ------------------------------------------ fseek(fp, 128, 0); //Skip 128 Bytes fseek(ft, 128, 0); fgets(a, 5, fp); //Retreive 'DICM' code fputs(a, ft); //------------------------------------------------------------------------------------------ while (flag == true) //Continue reading file when 'flag' is true { for (i=0; i<2; i++) { fread(&tag[i], sizeof(unsigned short), 1, fp); //Ordered pair of 16-bit unsigned int fwrite(&tag[i], sizeof(unsigned short), 1, ft); // fwrite(&tag[0], sizeof(unsigned short), 1, ft); // fwrite(&tag[0], sizeof(unsigned short), 1, ft); // fread(&tag[1], sizeof(unsigned short), 1, fp); //Ordered pair of 16-bit unsigned int // fwrite(&tag[1], sizeof(unsigned short), 1, ft); } if (tag[0]< 32736) //If it is in File-Header area { //----------------------------- Group 2 Header information --------------------------------- if (tag[0] == 2) //If Tag[0]=0002 hex(Group 2) { strcpy(VR, " "); fgets(VR,3,fp); //Read the VR first fwrite(VR,sizeof(char), 2, ft); if (tag[1] == 16) //Check for Transfer Syntax ID { fread(&ValueLength, sizeof(unsigned short), 1, fp); //Read the ValueLength fwrite(&ValueLength, sizeof(unsigned short), 1, ft); fgets(UID, ValueLength+1, fp); fwrite(UID, sizeof(char), ValueLength, ft); TagInfodlg.SetDlgItemText(IDC_EDIT5, (CString)(UID)); } else { if (strcmp(VR,"UL")==0) { fread(&ValueLength, sizeof(unsigned short), 1, fp); fwrite(&ValueLength, sizeof(unsigned short), 1, ft); fread(&LValueField, sizeof(unsigned long), 1, fp); fwrite(&LValueField, sizeof(unsigned long), 1, ft); } else if (strcmp(VR,"OB")==0) { fread(&ReservedField, sizeof(unsigned short), 1, fp); fwrite(&ReservedField, sizeof(unsigned short), 1, ft); fread(&ValueLength, sizeof(unsigned short), 1, fp); fwrite(&ValueLength, sizeof(unsigned short), 1, ft); fread(&LValueField, sizeof(unsigned long), 1, fp); fwrite(&LValueField, sizeof(unsigned long), 1, ft); } else if (strcmp(VR,"UI")==0) { fread(&ValueLength, sizeof(unsigned short), 1, fp); fwrite(&ValueLength, sizeof(unsigned short), 1, ft); String=new char[ValueLength+1]; fgets(String, ValueLength+1, fp); fwrite(String, sizeof(char), ValueLength, ft); } else if (strcmp(VR,"SH")==0) { fread(&ValueLength, sizeof(unsigned short), 1, fp); fwrite(&ValueLength, sizeof(unsigned short), 1, ft); String=new char[ValueLength+1]; fgets(String, ValueLength+1, fp); fwrite(String, sizeof(char), ValueLength, ft); } else if (strcmp(VR,"AE")==0) { fread(&ValueLength, sizeof(unsigned short), 1, fp); fwrite(&ValueLength, sizeof(unsigned short), 1, ft); String=new char[ValueLength+1]; fgets(String, ValueLength+1, fp); fwrite(String, sizeof(char), ValueLength, ft); } else // Read Implicit CS { num = (int)VR[0]; fgetc(fp); for (loop=0; loop<num+2; loop++) { t = fgetc(fp); fputc(t,ft); } } } } // ------------------------- Other Group Header information -------------------------------- // --------------- For Implicit VR Little Endian : DICOM default type ---------------------- else { if (strcmp(UID,"1.2.840.10008.1.2")==0) //Implicit VR Little Endian: Default for DICOM { fread(&ValueLength, sizeof(unsigned int) , 1, fp); //Read the ValueLength fwrite(&ValueLength, sizeof(unsigned int) , 1, ft); if (tag[0] == 0x28 && tag[1] == 0x10) //Get Image Row size { fread(&sdata, sizeof(unsigned short), 1, fp); fwrite(&sdata, sizeof(unsigned short), 1, ft); no_of_rows = sdata; TagInfodlg.SetDlgItemInt(IDC_EDIT1, sdata); } else if (tag[0] == 0x28 && tag[1] == 0x11) //Get Image Col size { fread(&sdata, sizeof(unsigned short), 1,fp); fwrite(&sdata, sizeof(unsigned short), 1, ft); no_of_cols = sdata; TagInfodlg.SetDlgItemInt(IDC_EDIT2, sdata); } else if (tag[0] == 0x28 && tag[1] == 0x30) //Get Pixel Spacing { String=new char[ValueLength+1]; fgets(String, ValueLength+1, fp); fwrite(String, sizeof(char), ValueLength, ft); pixel_res = atof(String); TagInfodlg.SetDlgItemText(IDC_EDIT13, CString(String)); } else if (tag[0] == 0x18 && tag[1] == 0x50) //Get Slice Thickness { String=new char[ValueLength+1]; fgets(String, ValueLength+1, fp); fwrite(String, sizeof(char), ValueLength, ft); slice_thickness = atof(String); TagInfodlg.SetDlgItemText(IDC_EDIT3, CString(String)); } else if (tag[0] == 0x10 && tag[1] == 0x20) //Get Patient's ID { String=new char[ValueLength+1]; fgets(String, ValueLength+1, fp); fwrite(String, sizeof(char), ValueLength, ft); Patient_ID = String; TagInfodlg.SetDlgItemText(IDC_EDIT6, CString(String)); // TagInfodlg.SetDlgItemText(IDC_EDIT6, CString("Undisclosed")); } else if (tag[0] == 0x10 && tag[1] == 0x10) //Get Patient's Name { String=new char[ValueLength+1]; fgets(String, ValueLength+1, fp); fwrite(String, sizeof(char), ValueLength, ft); TagInfodlg.SetDlgItemText(IDC_EDIT4, CString(String)); // TagInfodlg.SetDlgItemText(IDC_EDIT4, CString("Undisclosed")); } else if (tag[0] == 0x10 && tag[1] == 0x40) //Get Patient's Gender { String=new char[ValueLength+1]; fgets(String, ValueLength+1, fp); fwrite(String, sizeof(char), ValueLength, ft); TagInfodlg.SetDlgItemText(IDC_EDIT8, CString(String)); } else if (tag[0] == 0x10 && tag[1] == 0x1010) //Get Patient's Age { String=new char[ValueLength+1]; fgets(String, ValueLength+1, fp); fwrite(String, sizeof(char), ValueLength, ft); TagInfodlg.SetDlgItemText(IDC_EDIT7, CString(String)); } else if (tag[0] == 0x10 && tag[1] == 0x1030) //Get Patient's Weight { String=new char[ValueLength+1]; fgets(String, ValueLength+1, fp); fwrite(String, sizeof(char), ValueLength, ft); TagInfodlg.SetDlgItemText(IDC_EDIT14, CString(String)); } else if (tag[0] == 0x20 && tag[1] == 0x13) //Get Image Number { String=new char[ValueLength+1]; fgets(String, ValueLength+1, fp); fwrite(String, sizeof(char), ValueLength, ft); slice_img = CString(String); TagInfodlg.SetDlgItemText(IDC_EDIT15, slice_img); } else if (tag[0] == 0x20 && tag[1] == 0x32) //Get Image Position { String=new char[ValueLength+1]; fgets(String, ValueLength+1, fp); fwrite(String, sizeof(char), ValueLength, ft); TagInfodlg.SetDlgItemText(IDC_EDIT11, CString(String)); } else if (tag[0] == 0x8 && tag[1] == 0x60) //Get Modality { String=new char[ValueLength+1]; fgets(String, ValueLength+1, fp); fwrite(String, sizeof(char), ValueLength, ft); TagInfodlg.SetDlgItemText(IDC_EDIT9, CString(String)); } else if (tag[0] == 0x8 && tag[1] == 0x70) //Get Modality Manufacturer { String=new char[ValueLength+1]; fgets(String, ValueLength+1, fp); fwrite(String, sizeof(char), ValueLength, ft); TagInfodlg.SetDlgItemText(IDC_EDIT12, CString(String)); } else if (tag[0] == 0x8 && tag[1] == 0x8) //Get Image Type { String=new char[ValueLength+1]; fgets(String, ValueLength+1, fp); fwrite(String, sizeof(char), ValueLength, ft); TagInfodlg.SetDlgItemText(IDC_EDIT10, CString(String)); } else if (tag[0] == 0x817) { fseek(fp, ValueLength, SEEK_CUR); fseek(ft, ValueLength, SEEK_CUR); } else //All other data not needed, store it as string { String=new char[ValueLength+1]; fgets(String, ValueLength+1, fp); fwrite(String, sizeof(char), ValueLength, ft); } } // -------------------------- For Explicit VR Little Endian -------------------------------- else if (strcmp(UID,"1.2.840.10008.1.2.1")==0) { strcpy(VR, " "); fgets(VR,3,fp); //Read VR fwrite(VR, sizeof(char), 2, ft); if (tag[0] == 40 && tag[1] == 16) //Get Image Row Size { fread(&SValueLength, sizeof(unsigned short), 1, fp); fwrite(&SValueLength, sizeof(unsigned short), 1, ft); fread(&sdata, sizeof(unsigned short), 1, fp); fwrite(&sdata, sizeof(unsigned short), 1, ft); no_of_rows = sdata; TagInfodlg.SetDlgItemInt(IDC_EDIT1, sdata); } else if (tag[0] == 40 && tag[1] == 17) //Get Image Col Size { fread(&SValueLength, sizeof(unsigned short), 1, fp); fwrite(&SValueLength, sizeof(unsigned short), 1, ft); fread(&sdata, sizeof(unsigned short), 1,fp); fwrite(&sdata, sizeof(unsigned short), 1, ft); no_of_cols = sdata; TagInfodlg.SetDlgItemInt(IDC_EDIT2, sdata); } else if (tag[0] == 40 && tag[1] == 263) // Reading of maximum pixel value { fread(&ValueLength, sizeof(unsigned short), 1, fp); //Read Value Length (VL) - 16 bits fwrite(&ValueLength, sizeof(unsigned short), 1, ft); fread(&sdata, sizeof(unsigned short), 1, fp); //Read Value Field (4 bytes as indicated by VL) printf("\tField=%d\n", ValueField); fwrite(&sdata, sizeof(unsigned short), 1, ft); if (sdata <= 5) pixelmax=256; //If no pixelmax data, set it of 256 else pixelmax = sdata; } else { if (strcmp(VR,"UL")==0) { fread(&ValueLength, sizeof(unsigned short), 1, fp); fwrite(&SValueLength, sizeof(unsigned short), 1, ft); fread(&LValueField, sizeof(unsigned long), 1, fp); fwrite(&LValueField, sizeof(unsigned long), 1, ft); } else if (strcmp(VR,"FL")==0) { fread(&ValueLength, sizeof(unsigned short), 1, fp); //Read Value Length (VL) - 16 bits fwrite(&ValueLength, sizeof(unsigned short), 1, ft); fread(&iLength, sizeof(unsigned int), 1, fp); //Read Value Field (4 bytes as indicated by VL) fwrite(&iLength, sizeof(unsigned int), 1, fp); } else if (strcmp(VR, "OB") == 0) { fread(&ReservedField, sizeof(unsigned short), 1, fp); fwrite(&ReservedField, sizeof(unsigned short), 1, ft); fread(&ValueLength, sizeof(unsigned long), 1, fp); fwrite(&ValueLength, sizeof(unsigned long), 1, ft); for (i=0; i<ValueLength; i++) { t = fgetc(fp); fputc(t,ft); } } else if (strcmp(VR, "SQ") == 0) { fread(&ReservedField, sizeof(unsigned short), 1, fp); fwrite(&ReservedField, sizeof(unsigned short), 1, ft); fread(&ValueLength, sizeof(unsigned long), 1, fp); fwrite(&ValueLength, sizeof(unsigned long), 1, ft); for (i=0; i<ValueLength; i++) { t = fgetc(fp); fputc(t, ft); } } else if (strcmp(VR, "CS") == 0) { fread(&ValueLength, sizeof(unsigned short), 1, fp); fwrite(&ValueLength, sizeof(unsigned short), 1, ft); String = new char[ValueLength+1]; fgets(String, ValueLength+1, fp); fwrite(String, sizeof(char), ValueLength, ft); if (tag[0] == 0x08 && tag[1] == 0x60) //Get Modality { TagInfodlg.SetDlgItemText(IDC_EDIT9, CString(String)); } else if (tag[0] == 0x08 && tag[1] == 0x08) //Get Image Type { TagInfodlg.SetDlgItemText(IDC_EDIT10, CString(String)); } else if (tag[0] == 0x10 && tag[1] == 0x40) //Get Patient's Gender { TagInfodlg.SetDlgItemText(IDC_EDIT8, CString(String)); } } else if (strcmp(VR, "SL") == 0) { fread(&ValueLength, sizeof(unsigned short), 1, fp); fwrite(&ValueLength, sizeof(unsigned short), 1, ft); fread(&LValueField, sizeof(unsigned long), 1, fp); fwrite(&LValueField, sizeof(unsigned long), 1, ft); } else if (strcmp(VR, "FL") == 0) { fread(&ValueLength, sizeof(unsigned short), 1, fp); fwrite(&ValueLength, sizeof(unsigned short), 1, ft); if (ValueLength == 4) { fread(&FValueField, sizeof(unsigned long), 1, fp); fwrite(&FValueField, sizeof(unsigned long), 1, ft); } else { String = new char[ValueLength]; fgets(String, ValueLength+1, fp); fwrite(String, sizeof(char), ValueLength, ft); } } else if (strcmp(VR, "SL") == 0) { fread(&ValueLength, sizeof(unsigned short), 1, fp); fwrite(&ValueLength, sizeof(unsigned short), 1, ft); fread(&LValueField, sizeof(unsigned long), 1, fp); fwrite(&LValueField, sizeof(unsigned long), 1, ft); } else if (strcmp(VR, "SS") == 0) { fread(&ValueLength, sizeof(unsigned short), 1, fp); fwrite(&ValueLength, sizeof(unsigned short), 1 , ft); fread(&ValueField, sizeof(unsigned short), 1, fp); fwrite(&ValueField, sizeof(unsigned short), 1, ft); } else if (strcmp(VR, "US") == 0) { fread(&ValueLength, sizeof(unsigned short), 1, fp); fwrite(&ValueLength, sizeof(unsigned short), 1 , ft); String = new char[ValueLength]; fgets(String, ValueLength+1, fp); fwrite(String, sizeof(char), ValueLength, ft); } else if (strcmp(VR, "LT") == 0) { fread(&ValueLength, sizeof(unsigned short), 1, fp); fwrite(&ValueLength, sizeof(unsigned short), 1 , ft); for (i=0; i<ValueLength; i++) { t = fgetc(fp); fputc(t, ft); } } else { fread(&ValueLength, sizeof(unsigned short), 1, fp); fwrite(&ValueLength, sizeof(unsigned short), 1 , ft); String = new char[ValueLength+1]; fgets(String, ValueLength+1, fp); fwrite(String, sizeof(char), ValueLength, ft); if (tag[0] == 0x10 && tag[1] == 0x10) //Get Patient's Name { // TagInfodlg.SetDlgItemText(IDC_EDIT4, CString(String)); TagInfodlg.SetDlgItemText(IDC_EDIT4, CString("Undisclosed")); } else if (tag[0] == 0x10 && tag[1] == 0x20) //Get Patient's ID { TagInfodlg.SetDlgItemText(IDC_EDIT6, CString(String)); Patient_ID = CString(String); // TagInfodlg.SetDlgItemText(IDC_EDIT6, CString("Undisclosed")); } else if (tag[0] == 0x10 && tag[1] == 0x1010) //Get Patient's Age { TagInfodlg.SetDlgItemText(IDC_EDIT7, CString(String)); } else if (tag[0] == 0x18 && tag[1] == 0x50) //Get Slice Thickness { slice_thickness = atof(String); TagInfodlg.SetDlgItemText(IDC_EDIT3, CString(String)); } else if (tag[0] == 0x20 && tag[1] == 0x32) //Get Image Position { TagInfodlg.SetDlgItemText(IDC_EDIT11, CString(String)); } else if (tag[0] == 0x8 && tag[1] == 0x70) //Get Modality Manufacturer { TagInfodlg.SetDlgItemText(IDC_EDIT12, CString(String)); } else if (tag[0] == 0x28 && tag[1] == 0x30) //Get Pixel Resolution { pixel_res = atof(String); TagInfodlg.SetDlgItemText(IDC_EDIT13, CString(String)); } else if (tag[0] == 0x10 && tag[1] == 0x1030) { TagInfodlg.SetDlgItemText(IDC_EDIT14, CString(String)); } else if (tag[0] == 0x20 && tag[1] == 0x13) //Get Image Number { slice_img = CString(String); TagInfodlg.SetDlgItemText(IDC_EDIT15, CString(String)); } } } } else { fread(&ValueLength, sizeof(unsigned short), 1, fp); fwrite(&ValueLength, sizeof(unsigned short), 1, ft); String=new char[ValueLength+1]; //Reading Value Length fgets(String,ValueLength+1,fp); fwrite(String, sizeof(char), ValueLength, ft); } /* else { //UID not supported here CTransferSyntaxDialog adlg; adlg.DoModal(); return; } */ } } //----------------------- Code to read the pixel values of DICOM --------------------------- else if (tag[0] == 0x7FE0 && tag[1] < 0x0010) { fread(&ValueLength, sizeof(unsigned int) , 1, fp); fwrite(&ValueLength, sizeof(unsigned int) , 1, ft); fread(&LValue, sizeof(unsigned long), 1, fp); fwrite(&LValue, sizeof(unsigned long), 1, ft); position = ftell(ft); fclose(ft); } else { pixelmax = -99999; pixelmin = 99999; //************ Amended on 27 Sep 06 to display image in the correct orientation ************ if ((no_of_rows==512 && no_of_cols==512) || (no_of_rows==256 && no_of_cols==256)) { for (i=0; i<no_of_rows; i++) { for (j=0; j<no_of_cols; j++) { fread(&pixelval, sizeof(short), 1, fp); fwrite(&pixelval, sizeof(short), 1, ft); if (pixelval>17000) pixelval=0; if (pixelval<-2500) pixelval=0; pixelvalue[((no_of_rows-1)-i)*no_of_cols + j] = pixelval; pixelmax = (pixelval > pixelmax)? pixelval : pixelmax; //Find max pixel val for normalization pixelmin = (pixelval < pixelmin)? pixelval : pixelmin; //Find min pixel val maxpix = pixelmax; pixelvalue[i] = pixelval; } } } else { for (i=0; i<no_of_rows; i++) { for (j=0; j<no_of_cols; j++) { fread(&pixelval, sizeof(short), 1, fp); fwrite(&pixelval, sizeof(short), 1, ft); if (pixelval>17000) pixelval=0; if (pixelval<-2500) pixelval=0; pixelvalue[((no_of_rows-1)-i)*256 + j] = pixelval; pixelmax = (pixelval > pixelmax)? pixelval : pixelmax; //Find max pixel val for normalization pixelmin = (pixelval < pixelmin)? pixelval : pixelmin; //Find min pixel val maxpix = pixelmax; } } } //****************************************************************************************** if (no_of_rows == 512) //No duplicaion required { for (i=0; i<no_of_rows*no_of_cols; i++) { image[i] = (int)((float)(pixelvalue[i] - pixelmin)/(float)(pixelmax - pixelmin)*255.0f); // image2[i] = image[i]; } } else if (no_of_rows == 256) //Duplication of 4 pixels required) { for (i=0; i<no_of_rows*no_of_cols; i++) //For enlargement of 256 to 512 { image256[i] = (int)((float)(pixelvalue[i]-pixelmin)/(float)(pixelmax - pixelmin)*255.0f); // Used for 3D side view // image2[i] = image256[i]; //Increment to next image pixel } } else //All other sizes use 256x256 { i = 0; for (j=0; j<256; j++) //For enlargement of 256 to 512 { for (k=0; k<256; k++) { image256[i] = (int)((float)(pixelvalue[i]-pixelmin)/(float)(pixelmax - pixelmin)*255.0f); // Used for 3D side view i++; //Increment to next image pixel } } } flag = false; //Flag to stop the while loop to stop reading file draw = true; //Flag to indicate draw during OnDraw } } fclose(fp); fclose(ft); delete String; //Invalidate(); //UpdateWindow(); } return; }
Not if you're not going to post properly formatted code. This lot is absolutely unreadable due to lack of indentation.
Posted the properly indented code. @ beanbean : Plz do keep it in mind, when you post code here. I won't do it next time.
It's very interesting to Google "CLEO_MedivisionView". Do you know metamofia? He seems to be working on the same project as you By the way I hope the two of you have permission to post this code all over the internet.