Среда, 06 Ноября 2024, 03:01

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
курсовая
redinardДата: Понедельник, 10 Декабря 2012, 22:24 | Сообщение # 1
постоянный участник
Сейчас нет на сайте
народ обьясните
я получил задание создать программу сжатия чёрно-белого изображения, алгоритм LZW или jBig,я не могу понять как мне перевести изображение в двоичный код для работы над ним,подскажите пожалуйста как это сделать


Я белый и пушистый но имею когти и зубы
SnuuxДата: Вторник, 11 Декабря 2012, 18:46 | Сообщение # 2
постоянный участник
Сейчас нет на сайте
Проходишь циклом по всем пикселям изображения, внося в массив, если черный пиксель, то 0, если белый то 1 (можно наоборот, как удобнее). Заносишь эти чиса в массив, и дальше уже ими манипулируй. Как то так.
karuyДата: Вторник, 11 Декабря 2012, 19:11 | Сообщение # 3
заслуженный участник
Сейчас нет на сайте
НохчиДата: Вторник, 11 Декабря 2012, 19:25 | Сообщение # 4
заслуженный участник
Сейчас нет на сайте
Quote (karuy)
Как минимум цвет пикселя это RGB вектор.

В черно-белом изображении зачем этот вектор нужен?


Многие вопросы по Windows отпадут, если посмотреть тут
karuyДата: Вторник, 11 Декабря 2012, 19:27 | Сообщение # 5
заслуженный участник
Сейчас нет на сайте
Quote (redinard)
я не могу понять как мне перевести изображение в двоичный код для работы над ним,подскажите пожалуйста как это сделать

В стандартной кодировке ASCII имеется 256 символов, как в изображении представляется цвет пикселя знаешь, для примера цвет rgb(65, 66, 67) = ABC = 010000010100001001000011
ArchidoДата: Вторник, 11 Декабря 2012, 20:11 | Сообщение # 6
Сэнсэй
Сейчас нет на сайте
Действительно, и зачем тут нужен какой-то вектор... Изображение черно-белое (какой-нить grayscale), для хранения пикселя достаточно всего одного байта (яркость). Обычно если такое изображение сохранить как RGB, то получится что R = G = B, берем у каждого пикселя R и переводим в двоичку, G и B пропускаем. И так для каждого пикселя.

C++ - он особенный. С помощью него можно не только выстрелить себе в ногу, но и повеситься в пустой комнате:)
MatouДата: Вторник, 11 Декабря 2012, 20:20 | Сообщение # 7
Исходный коТ
Сейчас нет на сайте
Quote (karuy)
Как минимум цвет пикселя это RGB вектор.

Слова то какие умные.



redinardДата: Среда, 19 Декабря 2012, 19:36 | Сообщение # 8
постоянный участник
Сейчас нет на сайте
с первой своей задачей спрвился,перевёл в бинарный код,кодировал,применил метод Хафмана,теперь осталось декодировать,мозг уже просто отрубается
помогите пожалуйста,метод RLE,код привожу:
Code
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;

TCanvas *FPC;
static int W1,H1;

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;
                }

    if (!(neww=scan(head,element.c)))neww=scan(head,char(1));
    if ((neww->c==element.c)&&(neww->c!=char(1))){return head;}
     neww->le=(new el);
     neww->ri=(new el);
     neww->le->count=0;
     neww->le->c=char(1);
     neww->le->top=neww;
     neww->le->le=0;
     neww->le->ri=0;
     neww->ri->count=element.count;
     neww->ri->c=element.c;
     neww->ri->top=neww;
     neww->ri->le=0;
     neww->ri->ri=0;
     neww->count=0;
     neww->c=char(4);

     return head;
    }
    el *travel(int *x,el *head){
    (*x)++;
    if (head->le==0&&head->ri==0) return head;
    if (code[*x]==1) return travel(x,head->ri);
    if (code[*x]==0) return travel(x,head->le);
    }
    char readasc(int x){
    char c;
    c=0;
    for(int i=x+6;i>=x;i--)
     c=c*2+code[i];
    return c;}

    void dec(int code[1000000]){
    int i,j,k,x;
    el *element;
    pus.count=0;
    pus.c=char(1);
    head=0;
    head=dob(pus,head);
    el lol;
    lol.le=0;
    lol.ri=0;
    lol.count=0;
    lol.c=char(4);
    lol.c=readasc(0);
    decode[count1++]=lol.c;
    dob(lol,head);
    element=scan(head,lol.c);
    trans(element,head);
    x=6;
    while (1){
    element=travel(&x,head);
    if (element->c==char(1)){lol.c=readasc(x);
    if (lol.c==char(2)) break;
    x+=6;
   decode[count1++]=lol.c;
    dob(lol,head);
     element=scan(head,lol.c);
    trans(element,head);}
    else{decode[count1++]=element->c;
    trans(element,head);x--;}
      }}

//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
         : TForm(Owner)
{ int x=0;
}
//-------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
         W1=PaintBox1->Width;
         H1=PaintBox1->Height;
         //FPC=new Graphics::TCanvas;
}
//---------------------------------------------------------------------------
//
void __fastcall TForm1::Button2Click(TObject *Sender)
{
         OpenDialog1->Filter="*.bmp";
         OpenDialog1->InitialDir="C:\\";
         if (OpenDialog1->Execute())
         {
                  b=new Graphics::TBitmap;
                 b->LoadFromFile(OpenDialog1->FileName);
                 for(int i=0;i<W1;i++)
                         for(int j=0;j<H1;j++)
                    Form1->PaintBox1->Canvas->Pixels[i][j]=b->Canvas->Pixels[i][j];

         }
         //PaintBox1->Repaint();
         //delete b;
}
//---------------------------------------------------------------------------

void __fastcall TForm1::PaintBox1Paint(TObject *Sender)
{
         W1=PaintBox1->Width;
         H1=PaintBox1->Height;
         Form1->PaintBox1->Canvas->Rectangle(Rect(0,0,W1,H1));
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button1Click(TObject *Sender)
{   el El1,*element,*head;
El1.le=0;
El1.ri=0;
El1.count=0;
El1.c=char(1);
head=dob(El1,0);
count=0;

//========================================
  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)
---------------------------------------------
вопрос с курсачём закрыт,я сдал его,теперь мне интересно где можно скачать фракталы ?


Я белый и пушистый но имею когти и зубы
OlehhkaДата: Среда, 26 Декабря 2012, 19:14 | Сообщение # 9
частый гость
Сейчас нет на сайте
Для это-го есть специальные функций

redinardДата: Четверг, 03 Января 2013, 01:32 | Сообщение # 10
постоянный участник
Сейчас нет на сайте
да причём тут функции,мне фракталы сами готовые нужны были чтобы я их просто подключил,но уже всё это не важно,я уже сделал

Я белый и пушистый но имею когти и зубы
  • Страница 1 из 1
  • 1
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг