bmp转jpg(使用libjpeg)

2023-05-16

  jpg压缩原理可以参考这篇文章http://hi.baidu.com/tiandsp/item/f5a2dcde6ef1405bd73aae41,我很早以前转的一篇文章。

  没有使用libjpeg的压缩代码可以看看这篇文章http://hi.baidu.com/tiandsp/item/9b5843c58a3b4474cfd4f841,也是我很早以前转的。

  这次使用libjpeg库压缩和上一篇的解压正好对应起来,有好多函数名称我都是对称的起的,所以结合起来看效果更好。

  和上一篇一样,只能处理24位和8位的图像。

  代码如下:


#include <iostream>
#include <stdio.h>
extern "C"{
#include "jpeglib.h"
};
#pragma comment(lib,"jpeg.lib")
using namespace std;

#pragma pack(2)        //两字节对齐,否则bmp_fileheader会占16Byte
struct bmp_fileheader
{
    unsigned short    bfType;        //若不对齐,这个会占4Byte
    unsigned long    bfSize;
    unsigned short    bfReverved1;
    unsigned short    bfReverved2;
    unsigned long    bfOffBits;
};

struct bmp_infoheader
{
    unsigned long    biSize;
    unsigned long    biWidth;
    unsigned long    biHeight;
    unsigned short    biPlanes;
    unsigned short    biBitCount;
    unsigned long    biCompression;
    unsigned long    biSizeImage;
    unsigned long    biXPelsPerMeter;
    unsigned long    biYpelsPerMeter;
    unsigned long    biClrUsed;
    unsigned long    biClrImportant;
};

FILE *input_file;
FILE *output_file;

struct bmp_fileheader bfh;
struct bmp_infoheader bih;

unsigned char *src_buffer;
unsigned char *dst_buffer;

void read_bmp_header()
{    
    fread(&bfh,sizeof(struct bmp_fileheader),1,input_file);
    fread(&bih,sizeof(struct bmp_infoheader),1,input_file);
}

void read_bmp_data()
{
    fseek(input_file,bfh.bfOffBits,SEEK_SET);
    src_buffer=new unsigned char[bih.biWidth*bih.biHeight*bih.biBitCount/8];
    fread(src_buffer,sizeof(unsigned char)*bih.biWidth*bih.biHeight*bih.biBitCount/8,1,input_file);

    unsigned long width=bih.biWidth;
    unsigned long height=bih.biHeight;
    unsigned short depth=unsigned short(bih.biBitCount/8);
    unsigned char *src_point;
    unsigned char *dst_point;

    dst_buffer=new unsigned char[width*height*depth];    
    src_point=src_buffer+width*depth*(height-1);
    dst_point=dst_buffer+width*depth*(height-1);
    for (unsigned long i=0;i<height;i++)
    {
        for (unsigned long j=0;j<width*depth;j+=depth)
        {
            if (depth==1)        //处理灰度图
            {
                dst_point[j]=src_point[j];
            }

            if (depth==3)        //处理彩色图
            {
                dst_point[j+2]=src_point[j+0];
                dst_point[j+1]=src_point[j+1];
                dst_point[j+0]=src_point[j+2];
            }
        }
        dst_point-=width*depth;
        src_point-=width*depth;
    }
}

void synthese_jpeg()
{
    struct jpeg_compress_struct cinfo;
    struct jpeg_error_mgr jerr;
    JSAMPARRAY buffer;

    unsigned long width=bih.biWidth;
    unsigned long height=bih.biHeight;
    unsigned short depth=unsigned short(bih.biBitCount/8);
    unsigned char *point;

    cinfo.err=jpeg_std_error(&jerr);        //libjpeg各种配置
    jpeg_create_compress(&cinfo);
    jpeg_stdio_dest(&cinfo,output_file);

    cinfo.image_width=width;
    cinfo.image_height=height;
    cinfo.input_components=depth;
    if (depth==1)
        cinfo.in_color_space=JCS_GRAYSCALE;
    else
        cinfo.in_color_space=JCS_RGB;

    jpeg_set_defaults(&cinfo);
    jpeg_set_quality(&cinfo,20,TRUE);    //中间的值为压缩质量,越大质量越好
    jpeg_start_compress(&cinfo,TRUE);

    buffer=(*cinfo.mem->alloc_sarray)
            ((j_common_ptr)&cinfo,JPOOL_IMAGE,width*depth,1);

    point=dst_buffer+width*depth*(height-1);
    while (cinfo.next_scanline<height)
    {
        memcpy(*buffer,point,width*depth);
        jpeg_write_scanlines(&cinfo,buffer,1);
        point-=width*depth;
    }

    jpeg_finish_compress(&cinfo);
    jpeg_destroy_compress(&cinfo);
}

int main()
{
    input_file=fopen("lena_gray.bmp","rb");
    output_file=fopen("lena.jpg","wb");

    read_bmp_header();
    read_bmp_data();

    synthese_jpeg();

    fclose(input_file);
    fclose(output_file);

    delete[] src_buffer;
    delete[] dst_buffer;

    cout<<"good job."<<endl;
    cin.get();
    return 0;
}  

转载于:https://www.cnblogs.com/tiandsp/archive/2012/12/03/2799561.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

bmp转jpg(使用libjpeg) 的相关文章

  • mp4 转 jpg 图片

    先在 rosbag2video py 脚本中修改相关配置参数 然后运行脚本 python mp4 2 jpg py 代码如下 span class token keyword import span span class token mod
  • BMP格式详解

    介绍 数字图像在外存储器设备中的存储形式是图像文件 xff0c 图像必须按照某个已知的 公认的数据存储顺序和结构进行存储 xff0c 才能使不同的程序对图像文件顺利进行打开或存盘操作 xff0c 实现数据共享 图像数据在文件中的存储顺序和结
  • libjpeg.so.8: cannot open shared object file: No such file or directory.

    在docker容器里执行carla的PythonAPI报错 xff1a libjpeg so 8 cannot span class token function open span shared object file No such s
  • 从.bag文件中读取并保存.jpg图片和.pcd点云

    从 bag文件中读取并保存 jpg图片和 pcd点云 span class token comment usr bin env python span span class token comment coding utf 8 span s
  • 【FPGA】中值滤波处理BMP图片

    文章目录 一 中值滤波二 BMP图片格式三 功能实现1 代码设计思路2 shift IP核3 代码实现 四 结果测试参考博客 一 中值滤波 中值滤波法是一种非线性平滑技术 xff0c 它将每一像素点的灰度值设置为该点某邻域窗口内的所有像素点
  • macOS 软件推荐&避雷指南 - 让 mac 更像 windows 的装机必备软件

    网络上有很多 macOS 软件推荐的文章 但是那些文章大部分有下面的问题 没有结合使用场景 没有差评 从来不会说一个软件有什么缺点 是否稳定 所以这篇文章就围绕下面 2 点展开 安装哪些软件 可以让 macOS 的体验更加接近 window
  • Tensorflow:如何编码和读取bmp图像?

    我正在尝试读取 bmp 图像 对这些图像进行一些增强 将它们保存到 tfrecords 文件中 然后打开 tfrecords 文件并使用这些图像进行图像分类 我知道有一个 tf image encode jpeg 和一个 tf image
  • MATLAB - 编译 jpeg_read.c 创建 mexmaci64 文件时出错[重复]

    这个问题在这里已经有答案了 最近 我将 Matlab 项目从 Windows 操作系统转移到了 Mac 操作系统 所以我的 jpeg read mexw64 文件不再工作 我需要创建一个与 Mac OS 兼容的新 mexmaci64 文件
  • BMP 图像标题 - biXPelsPerMeter

    我已经阅读了很多有关 BMP 文件格式结构的内容 但我仍然无法理解字段 biXPelsPermeter 和 biYPelsPermeter 的真正含义是什么 我的意思是在实际中 它是如何使用的或者如何利用它 有什么例子或经验吗 多谢 双像素
  • 保存为 JPEG with Pillow 的图像与原始图像不同。

    我有一个 3 d numpy 数组 并使用 Pillow 将其保存为 JPEG 图像 当我使用 Pillow 重新加载图像时 生成的 numpy 数组有所不同 我为此编写了一个演示代码 from PIL import Image impor
  • MATLAB - 从 jpeg_write.c 创建 maxmaci64 时出错

    我在使用来自 jpeg 工具箱的 jpeg read c 和 jpeg write c 的 Mex 制作 mexmaci64 文件时遇到问题 我问了我的问题herejpeg read 的问题解决了 但当我编译jpeg write c时仍然有
  • C# 控制台应用程序 - 如何使用 GDI+ 在 BMP/JPG 文件中绘图?

    我想使用 C 控制台应用程序和 GDI 在 BMP 或 JPG 文件中绘制矩形 箭头 文本 线条等形状 这是我在网上找到的 c 将 System Drawing Graphics 保存到文件c 将 System Drawing Graphi
  • 如何将 UIImage 转换为 BMP 并另存为数据(不是 JPG 或 PNG)

    我正在我的 iOS 应用程序 Swift 3 和仅支持 BMP 格式的应用程序 在 MS Windows 上 之间同步 BMP 图像 在 MS Windows 应用程序上创建的 BMP 图像作为 base64 字符串下载 另存为Data并使
  • 如何将位图照片转换为十六进制颜色代码?

    我正在尝试为我的简历创建一个程序 但我在转换时遇到问题bitmap照片就是灰度照片转为十六进制 或者更好地称之为代码 如果颜色 有人可以帮助我吗 我尝试将其转换为Base64字符串但它不起作用 openFileDialog1 new Ope
  • Django OS X 错误的 JPEG 库版本:库是 80,调用者期望 62 sorl.thumbnail

    我在 Mac 上本地使用 sorl thumbnail for django 并且在使用 PIL 时遇到了问题 但今天我终于成功安装了它 libjpeg 遇到了一些问题 我现在可以上传和使用图像 但我无法使用 sorl thumbnail
  • Python Pygame 无法正确显示图像

    我是 Python 新手 我开始学习 Eric Matthes 的 Python 速成课程 我在 Pygame 章节的开头 遵循代码 但我加载的图像总是看起来损坏 我不知道为什么 代码来自书本 第一个文件 import pygame cla
  • bmp宽高比问题

    我一直在尝试了解 bmp 文件的工作原理 以便我可以渲染一些 Mandelbrot 设置图片并将它们输出为 bmp 文件 因为这似乎是最简单的方法之一 但由于某种原因 当我使用不是 1 的纵横比时 1 尽管它是 4 的幂 所以不需要填充 我
  • 使用 Windows 成像组件 (WIC) 的 Delphi 2007

    我需要在Delphi 2007中读取一些大约1 7mb的图片并将其从jpg转换为bmp 有些图片被剪切 灰度或转换后最差 我进行了搜索 但没有找到在 delphi 2007 中添加像 TWicImage 这样的 WIC 例程的技巧 我在某处
  • 读/写简单 BMP 图像 C++

    我正在尝试读取简单的 BMP 文件 并且在不执行任何操作的情况下将其再次写回文件 我不知道读取文件或写回文件时出错在哪里 我在阅读和写作时添加了填充 文件读取 std vector
  • 位图文件头大小

    我是 bmp 文件编程的新手 我检查了这个网站以了解 bmp 标头 http www daubnet com en file format bmp http www daubnet com en file format bmp bmp 文件

随机推荐