纯手写,jpeg压缩流程上传到资源资源下载
#define _CRT_SECURE_NO_WARNINGS
#define _USE_MATH_DEFINES
#include <stdlib.h>
#include <iostream>
#include<vector>
#include<math.h>
#include<string>
#include<fstream>
using namespace std;
int getArange(int a){//获得VLC映射
if (a < 0) a = -1 * a;
int b = 1;
while (pow(2, b) < a) {
b++;
}
return b;
}
//计算一个正数的二进制字符串
string toBinary(int a) {
string str = "";
vector<int> seq;
while (a != 0) {
seq.push_back(a % 2);
a /= 2;
}
for (int i = seq.size() - 1; i >= 0; i--) {
str += seq[i] + '0';
}
if (str == "") str = "0";
return str;
}
//计算一个负数的VLI码
string getVLI(int a) {
string str = "";
vector<int> seq;
a = -1 * a;
while (a != 0) {
int q = a % 2;
if (q == 1) q = 0;
else q = 1;
seq.push_back(q);
a /= 2;
}
for (int i = seq.size() - 1; i >= 0; i--) {
str += seq[i] + '0';
}
return str;
}
struct code { //熵编码的结构
string ssss;
string diff;
code(string ss, string dif) {
ssss = ss;
diff = dif;
}
};
struct midsyn { //cd 的中间符号(sssrrr,ac)
int a, b, c;
midsyn(int a1, int a2, int a3) {
a = a1;
b = a2;
c = a3;
}
};
class code_block
{
public:
vector<code> vc;
code_block() { //默认构造方法
}
private:
};
//定义8x8 的图像块类
class pixel_block
{
public:
double matrix[8][8];
pixel_block() { //默认构造方法
for (int i = 0; i < 8; i++)
for (int j = 0; j < 8; j++) {
matrix[i][j] = 0.0;
}
}
//正向离散余弦变换
double dct(int u, int v) {
double re_value=0;
if (u == 0 && v == 0) {
double result = 0;
double cv = 1 / sqrt(2);
for(int i=0;i<8;i++)
for (int j = 0; j < 8; j++) {
result += matrix[i][j];
}
re_value = 1.0 / 4.0 * cv * cv * result;
}
else {
double result = 0;
for (int i = 0; i < 8; i++)
for (int j = 0; j < 8; j++) {
result += matrix[i][j]*cos((2*i+1)*u*M_PI/16)* cos((2 * j + 1) * v * M_PI / 16.0);
}
re_value = 1.0 / 4.0 * result;
}
return re_value;
}
private:
};
int main()
{
FILE* file = fopen("d03.data", "rb");
int h, w;
fread(&h, sizeof(int), 1,