Chào mừng đến với Diễn đàn lập trình - Cộng đồng lập trình.
Trang 1 của 2 12 CuốiCuối
Kết quả 1 đến 10 của 13
  1. #1
    Ngày tham gia
    Sep 2015
    Bài viết
    0

    chuyển file .pcx thành file .pmb

    mình vừa nhận được cái đề có tính ứng dụng rất căn bản và cũng khá lý thú nhưng loay hoay giải quyết 1 mình thì không vui tí nào pót lên đây anh em cùng xắn tay áo (hay xắn quần cũng được [IMG]images/smilies/smile.png[/IMG] ) cùng làm với mình nha! rất mong sự cộng tác của anh em!
    đề :
    _đọc 1 file .pcx
    _đọc 1 file .bmp
    _chuyen file pcx -> .bmp
    _chuyen file bmp -> .pcx


    .....................strat.................[IMG]images/smilies/applause.gif[/IMG]

  2. #2
    Ngày tham gia
    Sep 2015
    Đang ở
    Số 60 Thái Hà, Đống Đa, Hà Nội
    Bài viết
    0
    mình viết trên viúal studio 2005 mình khai báo và đọc cái header .pcx như vầy:

    [CODE = CPP]
    // PCX_Ver1.cpp : Defines the entry point for the console application.
    //
    #include "stdafx.h"
    #include "iostream"
    #include "fstream"
    #include "stdio.h"
    using namespace std;

    //cau truc mo ta cua 1 thanh phan mau (RGB)
    typedef struct RGB_ENTRY
    {
    unsigned char R;
    unsigned char G;
    unsigned char B;
    }RGB_ENTRY;

    //dinh nghia cau truc cua 1 Header!
    typedef struct PCX_HEADER
    {
    unsigned char manufacturer;
    unsigned char version;
    unsigned char encoding;
    unsigned char bitsPerPixel;
    short xMin;
    short yMin;
    short xMax;
    short yMax;
    short hDPI;
    short vDPI;
    RGB_ENTRY colorPalette[16];
    unsigned char reserved;
    unsigned char colorPlane;
    unsigned int bytesPerLine;
    unsigned int paletteInfo;
    char filter[58];
    }PCX_HEADER;

    typedef struct pcx_picture
    {
    PCX_HEADER header;
    RGB_ENTRY _256ExtendColorPalette[256];
    char * buffer;
    }pcx_picture;

    void PCX_Load(char *filename, pcx_picture &pic)
    {
    FILE *fp;
    int num_bytes,
    index;
    long count;
    unsigned char data;
    char *temp_buffer;
    //mo file
    fp = fopen(filename, "rb");
    //doc header
    fread(&pic.header, sizeof(PCX_HEADER), 1, fp);
    //kiem tra co phan mo rong ko?
    if(pic.header.bitsPerPixel == 8 && pic.header.colorPlane ==1)
    {
    int n = 256 * sizeof(RGB_ENTRY);
    fseek(fp, -n, SEEK_END);
    fread(pic._256ExtendColorPalette, sizeof(RGB_ENTRY),256, fp);
    }
    cout << ftell(fp); //--> 136??



    }
    void main()
    {
    pcx_picture pic;
    PCX_Load("BEAR.PCX", pic);
    }
    [/CODE]
    nhưng theo mình tìm hiểu thì cái header này chỉ có 128 bytes thui ko hieu sao khi dung ftell(fp) (sau khi đọc xong cái header ) thì nó lại xuất ra là 136 [IMG]images/smilies/Surprised.gif[/IMG]
    các cao thu xem thử dùm mình nha!
    a` còn cái vụ giải nén cái file .pcx (theo RLE) nữa mới mệt đây...[IMG]images/smilies/waiting.gif[/IMG]

  3. #3
    mình viết trên viúal studio 2005 mình khai báo và đọc cái header .pcx như vầy:

    Mã:
    // PCX_Ver1.cpp : Defines the entry point for the console application.
    //
    #include "stdafx.h"
    #include "iostream"
    #include "fstream"
    #include "stdio.h"
    using namespace	std;
    
    //cau truc mo ta cua 1 thanh phan mau (RGB)
    typedef struct RGB_ENTRY 
    {
    	unsigned char R;
    	unsigned char G;
    	unsigned char B;
    }RGB_ENTRY;
    
    //dinh nghia cau truc cua 1 Header!
    typedef struct PCX_HEADER 
    {
    	unsigned char manufacturer;
    	unsigned char version;
    	unsigned char encoding;
    	unsigned char bitsPerPixel;
    	 short  xMin;
         short  yMin;
         short  xMax;
         short  yMax;
         short  hDPI;
         short  vDPI;
    	RGB_ENTRY colorPalette[16];
    	unsigned char reserved;
    	unsigned char colorPlane;
    	unsigned int bytesPerLine;
    	unsigned int paletteInfo;
    	char filter[58];
    }PCX_HEADER;
     
    typedef struct pcx_picture
    {
    	PCX_HEADER header;
    	RGB_ENTRY  _256ExtendColorPalette[256];
    	char	* buffer;
    }pcx_picture;
    
    void	PCX_Load(char *filename, pcx_picture &pic)
    {
    	FILE *fp;
    	int num_bytes,
    		index;
    	long count;
    	unsigned char data;
    	char *temp_buffer;
    	//mo file
    	fp = fopen(filename, "rb");
    	//doc header
    	fread(&pic.header, sizeof(PCX_HEADER), 1, fp);
    	//kiem tra co phan mo rong ko?
    	if(pic.header.bitsPerPixel == 8 && pic.header.colorPlane ==1)
    	{
    		int n = 256 * sizeof(RGB_ENTRY);
    		fseek(fp, -n, SEEK_END);
    		fread(pic._256ExtendColorPalette, sizeof(RGB_ENTRY),256, fp); 
    	}
    	cout << ftell(fp); //--> 136??
    	
    	
    
    }
    void	main()
    {
    	pcx_picture pic;
    	PCX_Load("BEAR.PCX", pic);
    }
    nhưng theo mình tìm hiểu thì cái header này chỉ có 128 bytes thui ko hieu sao khi dung ftell(fp) (sau khi đọc xong cái header ) thì nó lại xuất ra là 136 [IMG]images/smilies/Surprised.gif[/IMG]
    các cao thu xem thử dùm mình nha!
    a` còn cái vụ giải nén cái file .pcx (theo RLE) nữa mới mệt đây...[IMG]images/smilies/waiting.gif[/IMG]

  4. #4
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    mình viết trên viúal studio 2005 mình khai báo và đọc cái header .pcx như vầy:


    Mã:
    // PCX_Ver1.cpp : Defines the entry point for the console application.//#include "stdafx.h"#include "iostream"#include "fstream"#include "stdio.h"using namespace std; //cau truc mo ta cua 1 thanh phan mau (RGB)typedef struct RGB_ENTRY {    unsigned char R;    unsigned char G;    unsigned char B;}RGB_ENTRY; //dinh nghia cau truc cua 1 Header!typedef struct PCX_HEADER {    unsigned char manufacturer;    unsigned char version;    unsigned char encoding;    unsigned char bitsPerPixel;     short  xMin;     short  yMin;     short  xMax;     short  yMax;     short  hDPI;     short  vDPI;    RGB_ENTRY colorPalette[16];    unsigned char reserved;    unsigned char colorPlane;    unsigned int bytesPerLine;    unsigned int paletteInfo;    char filter[58];}PCX_HEADER; typedef struct pcx_picture{    PCX_HEADER header;    RGB_ENTRY  _256ExtendColorPalette[256];    char    * buffer;}pcx_picture; void    PCX_Load(char *filename, pcx_picture &pic){    FILE *fp;    int num_bytes,        index;    long count;    unsigned char data;    char *temp_buffer;    //mo file    fp = fopen(filename, "rb");    //doc header    fread(&pic.header, sizeof(PCX_HEADER), 1, fp);    //kiem tra co phan mo rong ko?    if(pic.header.bitsPerPixel == 8 && pic.header.colorPlane ==1)    {        int n = 256 * sizeof(RGB_ENTRY);        fseek(fp, -n, SEEK_END);        fread(pic._256ExtendColorPalette, sizeof(RGB_ENTRY),256, fp);     }    cout << ftell(fp); //--> 136??         }void    main(){    pcx_picture pic;    PCX_Load("BEAR.PCX", pic);}
    nhưng theo mình tìm hiểu thì cái header này chỉ có 128 bytes thui ko hieu sao khi dung ftell(fp) (sau khi đọc xong cái header ) thì nó lại xuất ra là 136 [IMG]images/smilies/Surprised.gif[/IMG]
    các cao thu xem thử dùm mình nha!
    a` còn cái vụ giải nén cái file .pcx (theo RLE) nữa mới mệt đây...[IMG]images/smilies/waiting.gif[/IMG]

  5. #5
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Cả 2 thằng này đều áp dụng thuật toán nén dữ liệu RLE(Run Length Encoding-mã hóa theo độ dài lặp lại của dữ liệu) để chạy chỉ khác nhau về việc xử lý các trường hợp đặc biệt(truơng hợp phản tác dụng) thôi nên việc convert giữa 2 thằng này chỉ có 3 việc là: đọc lên -> giải nén -> nén lại với thuật toán tương ứng là được.


    ps: post quá nhiều bài giống nhau. Mod sẽ del bài viết của bạn đó.

  6. #6
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    mình biết tư tưởng nó là vậy nhưng mà khi mình bắt tay vào làm thi no sinh ra nhiều problem khó hiểu lắn bạn ơi, vd như việc mình giải nén cái thèng pcx theo RLE thôi mình cũng có thử nhưng mà bạn có biết cách nào để biết mình giải nén đúng ko vậy bạn!
    thanks attend!

  7. #7
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    đây là hàm giải mã file PCX của mình bạn tham khảo thêm nhé.


    Mã:
     int PCXDecode_a_File(FILE *fEncode, FILE *fDecode){    unsigned char c, n;    while (!feof(fEncode))    {        c = (unsigned char) getc(fEncode);        if (c == EOF)            break;        if ((c & 0xC0) == 0xC0)         {            n = c & 0x3f;            c = (unsigned char) getc(fEncode);        }        else n = 1;        for (int i=0; i<n; i++)            putc(c, fDecode);    }    fclose(fDecode);       return 1;}

  8. #8
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    mình cũng hiểu hiểu đoạn code này rùi nhưng bạn ơi, cái này là mình cần giải nén ra rồi ghi lên 1 buffer nào đó để tiện cho việc sau này mình còn phải chuyển nó qua file .bmp nửa mà, như vầy là bạn đả ghi nó ngược lại lên 1 file khác mất rùi!

  9. #9
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    [IMG]images/smilies/applause.gif[/IMG]
    Thiệt tình là bó tay luôn.
    1 ông thì đang học CTDL 2. Đăng bài lên hỏi
    1 ông thì copy i chang tài liệu của thầy đem trả lời
    2 ông cùng học 1 trường + 1 thầy
    thêm 1 ông post bài trả lời này nữa là 3

    KHTN TP.HCM muôn năm [IMG]images/smilies/smile.png[/IMG] [IMG]images/smilies/smile.png[/IMG] [IMG]images/smilies/smile.png[/IMG] [IMG]images/smilies/smile.png[/IMG] [IMG]images/smilies/smile.png[/IMG]

  10. #10
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Dĩ nhiên là UNS = numberone ròy
    \(^_^)/
    hehe

 

 
Trang 1 của 2 12 CuốiCuối

Quyền viết bài

  • Bạn Không thể gửi Chủ đề mới
  • Bạn Không thể Gửi trả lời
  • Bạn Không thể Gửi file đính kèm
  • Bạn Không thể Sửa bài viết của mình
  •