Bezstratna kompresja BMP na JPG - proszę o pomoc

0

Witam wszystkich Forumowiczów,

Piszę z prośbą o pomoc w napisaniu programu konwertującego plik BMP (24 bitowa głębia) na JPG według algorytmu kodowania Shannon'a.
Pomimo, iż przeszukałem forum i znalazłem pewne fragmenty, które mogłyby stanowić cześć mojego kodu, nie potrafię skleić tego w całość i w sumie to nie mam czegokolwiek. Niestety, sam nie umiem sobie poradzić.
Czy któryś z forumowiczów byłby w stanie napisać kod takiego programu, lub poprowadził by mnie, jak dziecko za rękę, krok po kroku, do rozwiązania?
Nie mam dużej wiedzy w programowaniu, generalnie i w C++, stąd moja prośba.

Serdecznie pozdrawiam,
Kamil

0

Nie ma nic za darmo -> pokaż, do czego doszedłeś albo zapłać. Takie reguły tu panują.

0

To jest cały kod jaki wyklepałem od momentu rozpoczęcia postu i działa. Teraz chciałbym wyświetlić, poprawnie, wartości, które zdefiniowałem w strukturze bmpHeader - podaję przykład:


Type:19778
Size:1254
Reserve1:0
Reserve2:0
OffBits:54
biSize:40
Width:20
Height:20
biPlanes:1
biBitCount:24
biCompression:0
biSizeImage:1200
biXPelsPerMeter:2834
biYPelsPerMeter:2834
biClrUsed:0
biClrImportant:0

Mój Kod:

#include <iostream>
#include <fstream>
#include <stdint.h>
using namespace std;
int main()
{
cout<<"*** Program konwertujacy plik BMP na JPG wedlug algorytmu Shannon'a **"<<endl;
cout<<"Podaj lokalizacje pliku bitmapy: ";
char
lokalizacja_pliku=new char;
//string lokalizacja_pliku;
cin>>lokalizacja_pliku;
//cout<<"Podana przez Ciebie lokalizacja: "<<lokalizacja_pliku<<endl;

ifstream plikbmp;
plikbmp.open(lokalizacja_pliku, ios::in | ios::binary);
if(!plikbmp.is_open()) {cerr<<"Brak mozliwosci otwarcia pliku z lokalizacji: "<<lokalizacja_pliku<<endl;}


struct bmpHeader
{
uint16_t bfType;
uint32_t bfSize;
uint16_t bfReserved1;
uint16_t bfReserved2;
uint32_t bfOffBits;
uint32_t biSize;
uint32_t biWidth;
uint32_t biHeight;
uint16_t biPlanes;
uint16_t biBitCount;
uint32_t biCompression;
uint32_t biSizeImage;
uint32_t biXPelsPerMeter;
uint32_t biYPelsPerMeter;
uint32_t biClrUsed;
uint8_t  biClrImportant;
uint8_t  biClrRotation;
uint16_t biReserved;
} __attribute__ ((packed));

bmpHeader hfile;

cout<<"\nRozmiar naglowka: "<<sizeof(bmpHeader)<<" Bajty"<<endl;

0

Wymodziłem na razie coś takiego. Nie wiem na ile jest to sprawne i mam prośbę do jakieś dobrej duszy, o sprawdzenie tych moich wypocin.
Jest to zrzutka z tego co znalazłem w necie i na forach.

#include <iostream>
#include <fstream>
#include <stdint.h>
using namespace std;
int main()
{
cout<<"*** Program konwertujacy plik BMP na JPG wedlug algorytmu Shannon'a **"<<endl;
cout<<"Podaj lokalizacje pliku bitmapy: ";
char
lokalizacja_pliku=new char;
cin>>lokalizacja_pliku;

ifstream plikbmp;
plikbmp.open(lokalizacja_pliku, ios::in | ios::binary);
if(!plikbmp.is_open()) 
  {
   cerr<<"Brak mozliwosci otwarcia pliku z lokalizacji: "<<lokalizacja_pliku<<endl;
   system("pause");
   return 0;
  }
else
  {
   struct bmpHeader
   {
uint16_t bfType;
uint32_t bfSize;
uint16_t bfReserved1;
uint16_t bfReserved2;
uint32_t bfOffBits;
uint32_t biSize;
uint32_t biWidth;
uint32_t biHeight;
uint16_t biPlanes;
uint16_t biBitCount;
uint32_t biCompression;
uint32_t biSizeImage;
uint32_t biXPelsPerMeter;
uint32_t biYPelsPerMeter;
uint32_t biClrUsed;
uint8_t  biClrImportant;
uint8_t  biClrRotation;
uint16_t biReserved;
} __attribute__ ((packed));

bmpHeader hfile;

cout<<"\nRozmiar naglowka: "<<sizeof(bmpHeader)<<" Bajty"<<endl;

*memset(&hfile, 0, sizeof(bmpHeader)); *NIE WIEM CZY TA LINIA JEST POTRZEBNA (?)

plikbmp.read((char*)&hfile.bfType, 2); //BEZ TEJ LINII PONIŻSZA WYKONUJE SIĘ NIEPOPRAWNIE, NIE WIEM DLACZEGO :/
cout<<"bfType: "<<((char*) &(hfile.bfType))[0]<<((char*) &(hfile.bfType))[1]<<" ("<<hfile.bfType<<")"<<endl;
cout<<"bfReserved1: "<<hfile.bfReserved1<<endl;
cout<<"bfReserved2: "<<hfile.bfReserved2<<endl;
cout<<"bfOffBits: "<<hfile.bfOffBits<<endl;
cout<<"biWidth: "<<hfile.biWidth<<endl;
cout<<"biHeight: "<<hfile.biHeight<<endl;
cout<<"biPlanes: "<<hfile.biPlanes<<endl;
cout<<"biBitCount: "<<hfile.biBitCount<<endl;
cout<<"biCompression: "<<hfile.biCompression<<endl;
cout<<"biSizeImage: "<<hfile.biSizeImage<<endl;
cout<<"biXPelsPerMeter: "<<hfile.biXPelsPerMeter<<endl;
cout<<"biYPelsPerMeter: "<<hfile.biYPelsPerMeter<<endl;
cout<<"biClrUsed: "<<hfile.biClrUsed<<endl;
cout<<"biClrImportant: "<<hfile.biClrImportant<<endl;
cout<<"biClrRotation: "<<hfile.biClrRotation<<endl;
cout<<"biReserved: "<<hfile.biReserved<<endl;
plikbmp.close();

}

system("pause");
return 0;
}

0

To miejsce mi się nie podoba.

    cout<<"* Program konwertujacy plik BMP na JPG wedlug algorytmu Shannon'a *"<<endl;
    cout<<"Podaj lokalizacje pliku bitmapy: ";
    char* lokalizacja_pliku=new char;
0

Po kiego dajesz else, skoro wcześniej zamykasz program? W konsekwencji i tak nie wykona się kod w bloku else jeżeli wystąpi błąd.

    plikbmp.open(lokalizacja_pliku, ios::in | ios::binary);
    if(!plikbmp.is_open())
      {
       cerr<<"Brak mozliwosci otwarcia pliku z lokalizacji: "<<lokalizacja_pliku<<endl;
       system("pause");    // Tak się nie powinno robić, ale dobra, niech Ci będzie.
       return 0;                   // Zamykasz program.
      }
    else                             // Po co else, skoro w przypadku błędu linijkę wyżej zamykasz program?
      {
0
   plikbmp.read((char*)&hfile.bfType, 2);                                    //BEZ TEJ LINII PONIŻSZA WYKONUJE SIĘ NIEPOPRAWNIE, NIE WIEM DLACZEGO :/              
   cout<<"bfType: "<<((char*) &(hfile.bfType))[0]<<((char*) &(hfile.bfType))[1]<<" ("<<hfile.bfType<<")"<<endl;

Cóż jeżeli w tym miejscu nie wiesz, co robi ta linijka

plikbmp.read((char*)&hfile.bfType, 2);

pozostaje tylko współczuć. Zacznij uczyć się języka od początku i daj sobie spokój z pisaniem konwertera BMP/JPEG.

No dobra pomogę Ci
http://96w.utnij.net
http://96x.utnij.net
http://96v.utnij.net

0

gratuluje kamil_ jak dla totalnego nooba i tak dużo zdziałałeś szkoda, że nic nie rozumiesz z tego co napisałeś.

1 użytkowników online, w tym zalogowanych: 0, gości: 1