народ обьясните я получил задание создать программу сжатия чёрно-белого изображения, алгоритм LZW или jBig,я не могу понять как мне перевести изображение в двоичный код для работы над ним,подскажите пожалуйста как это сделать Я белый и пушистый но имею когти и зубы
Проходишь циклом по всем пикселям изображения, внося в массив, если черный пиксель, то 0, если белый то 1 (можно наоборот, как удобнее). Заносишь эти чиса в массив, и дальше уже ими манипулируй. Как то так.
я не могу понять как мне перевести изображение в двоичный код для работы над ним,подскажите пожалуйста как это сделать
В стандартной кодировке ASCII имеется 256 символов, как в изображении представляется цвет пикселя знаешь, для примера цвет rgb(65, 66, 67) = ABC = 010000010100001001000011
Действительно, и зачем тут нужен какой-то вектор... Изображение черно-белое (какой-нить grayscale), для хранения пикселя достаточно всего одного байта (яркость). Обычно если такое изображение сохранить как RGB, то получится что R = G = B, берем у каждого пикселя R и переводим в двоичку, G и B пропускаем. И так для каждого пикселя. C++ - он особенный. С помощью него можно не только выстрелить себе в ногу, но и повеситься в пустой комнате:)
с первой своей задачей спрвился,перевёл в бинарный код,кодировал,применил метод Хафмана,теперь осталось декодировать,мозг уже просто отрубается помогите пожалуйста,метод RLE,код привожу:
char P[200][200]={0}; char D[40000]={0}; int matr[40000]={0}; int len; Graphics::TBitmap *b;
struct el{ el *top,*le,*ri; int count; char c;
}pus,*head=0; int count=0,count1=0; int code[10000000],decode[10000]; int fa[10000]; void swap(el *hh,el *element){ el *asd,*dsa; asd=hh->top; dsa=element->top; if (asd==dsa&&hh!=element){ if (asd->le==hh){ asd->le=element; dsa->ri=hh; } else{dsa->le=hh;asd->ri=element;}return;} if (asd->le==hh) asd->le=element; if (asd->ri==hh) asd->ri=element; if (dsa->le==element) dsa->le=hh; if (dsa->ri==element) dsa->ri=hh; element->top=asd; hh->top=dsa; }; int scan2(el *element,el *head){ el *temp; int x=0; if (element->count==0) element=element->top; while(element!=head){ temp=element->top; if (temp->ri==element) fa[x]=1; else fa[x]=0; x++; element=temp;} return x; } el *scan1(el *element,el *head){ el *headl=0,*headr=0; if (head==element) return head; if ((head->count==element->count)&&(head->c!=char(4))) return head; if (head->ri!=0) headr=scan1(element,head->ri); if (head->le!=0) headl=scan1(element,head->le); if (headr==0) return headl; return headr; } void trans(el *element,el *head){ el* hh; if (element==head){element->count++; return;} hh=scan1(element,head); swap(hh,element); element->count++; trans(element->top,head); return; }
el *scan(el *head,char c){ el *headl=head,*headr=head; if (head->c==c) return head; if (head->ri)headr=scan(head->le,c); if (head->le)headl=scan(head->ri,c); if (headr!=head) return headr; if (headl!=head) return headl; return head->top;}
el *dob(el element,el *head){ el *neww; if (!head){ head=(new el); head->count=element.count; head->c=element.c; head->top=0; head->le=0; head->ri=0; return head; }
//======================================== for(int i=0;i<W1;i++) { for(int j=0;j<H1;j++) if (Form1->PaintBox1->Canvas->Pixels[i][j] == clWhite) P[i][j]='0' ; else P[i][j]='1'; Form1->Memo1->Lines->Add(P[i]); } int l=0; for(int i=0;i<W1;i++) for(int j=0;j<H1;j++) D[l++]=P[i][j]; len=0; char c; c=D[0]; int k=0,i; for (i=0;i<l;i++) { if (c==D[i]) { k++; } else { c=D[i]; matr[len++]=k; k=1; } } matr[len++]=k; //======================================
for(int i=0;i<len;i++){ El1.c=matr[i-1]; dob(El1,head); element=scan(head,matr[i-1]); int f=scan2(element,head); int R=f-1; for(int j=R;j>=0;j--) { code[count++]=fa[j];} if (element->count==0){ int f=(int)matr[i-1]; for(int qwe=0;qwe<=6;qwe++){ code[count++]=f%2; f=f/2;}} //printt(head,0); trans(element,head); } for (i=0;i<len;i++) Form1->Memo1->Lines->Add(IntToStr(matr[i]));
for (i=0;i<count;i++) Form1->Memo1->Lines->Add(IntToStr(code[i]));
//массив matr закодировать методом Хафмана //сделать декодирование полученного массива и вывести его на новый пэйнтбокс } //---------------------------------------------------------------------------
пишу на Builder 6
Добавлено (19.12.2012, 19:36) --------------------------------------------- вопрос с курсачём закрыт,я сдал его,теперь мне интересно где можно скачать фракталы ?
да причём тут функции,мне фракталы сами готовые нужны были чтобы я их просто подключил,но уже всё это не важно,я уже сделал Я белый и пушистый но имею когти и зубы