当前位置:网站首页>Installation and use of libjpeg and ligpng
Installation and use of libjpeg and ligpng
2022-07-05 08:10:00 【Nanbolwan】
Recently, I am doing dot matrix display , The program needs to read pixel data from the image file , So I studied libjpeg Library usage .
download
http://www.ijg.org/
https://sourceforge.net/projects/libpng/files/libpng16/1.6.34/
Cross compilation
1. decompression jpegsrc.v9b.tar.gz
tar -xvf jpegsrc.v9b.tar.gz
2. cd jpeg-9b
3. ./configure --host=KaTeX parse error: Expected 'EOF', got '&' at position 76: …static 4. make &̲& make install …PWD/install --prefix=aarch64-linux --enable-shared --enable-static
7. make && make install
When the compilation is complete install Get library files under folder
take include Copy the header file of to the header file directory of the compiler , Then link the corresponding library .
Programming
I wrote a class
#ifndef BMAT_H
#define BMAT_H
#include <jpeg/jpeglib.h>
#include <jpeg/jerror.h>
#include <png/png.h>
#include <setjmp.h>
#include <stdio.h>
#include <cstring>
struct Color {
Color() : r(0), g(0), b(0) {
}
Color(uint8_t rr, uint8_t gg, uint8_t bb) : r(rr), g(gg), b(bb) {
}
uint8_t r;
uint8_t g;
uint8_t b;
};
template <class T>
class BMat {
public:
BMat() : with(0), hight(0), mat(NULL) {
}
BMat(unsigned int w_, unsigned int h_) : with(w_), hight(h_) {
mat = new T*[with];
for (int i = 0; i < with; i++)
mat[i] = new T[hight];
}
virtual ~BMat() {
for (int i = 0; i < with; i++) {
delete mat[i];
}
delete mat;
}
T* operator[](int x) {
if (x < with)
return mat[x];
}
/* * Returns the number of rows of the matrix. * If the matrix saves an image, it returns the height of the image. */
unsigned int rows(){
return hight;
}
unsigned int cols(){
return with;
}
/* * Loading image data from the image file is saved in the matrix. * Currently, only RGB color system is supported, * and JPEG and PNG file formats are supported. */
bool imread(const char *file) {
char *p = strstr(file, ".");
if (strncmp(p, ".jpg", 4) == 0) {
return readjpeg(file);
} else if (strncmp(p, ".png", 4) == 0) {
unsigned char checkheader[8];
FILE *fp = fopen(file, "rb");
if(fp == NULL){
fprintf(stderr, "%s open failed\n", file);
return false;
}
if(fread(checkheader, 1, PNG_BYTES_TO_CHECK, fp) != PNG_BYTES_TO_CHECK){
fprintf(stderr, "checkheader failed\n");
fclose(fp);
return false;
}
if(readpng(&fp)){
fclose(fp);
return true;
}else{
fclose(fp);
return false;
}
}
return false;
}
protected:
struct error_mgr {
struct jpeg_error_mgr pub;
jmp_buf setjmp_buffer;
};
METHODDEF(void) my_error_exit(j_common_ptr cinfo) {
struct error_mgr *myerr = (struct error_mgr *) cinfo->err;
(*cinfo->err->output_message) (cinfo);
longjmp(myerr->setjmp_buffer, 1);
}
/*Reading image data from JPG image file*/
bool readjpeg(const char *file) {
struct jpeg_decompress_struct cinfo;
struct error_mgr jerr;
FILE *infile;
JSAMPARRAY buffer;
int row_stride;
if ((infile = fopen(file, "rb")) == NULL) {
fprintf(stderr, "can't open %s\n", file);
return false;
}
cinfo.err = jpeg_std_error(&jerr.pub);
jerr.pub.error_exit = my_error_exit;
if (setjmp(jerr.setjmp_buffer)) {
jpeg_destroy_decompress(&cinfo);
fclose(infile);
return false;
}
jpeg_create_decompress(&cinfo);
jpeg_stdio_src(&cinfo, infile);
(void) jpeg_read_header(&cinfo, TRUE);
if (!mat) {
with = cinfo.image_width;
hight = cinfo.image_height;
mat = new Color*[with];
for (int i = 0; i < with; i++)
mat[i] = new Color[hight];
} else {
for (int i = 0; i < with; i++) {
delete mat[i];
}
delete mat;
with = cinfo.image_width;
hight = cinfo.image_height;
mat = new Color*[with];
for (int i = 0; i < with; i++)
mat[i] = new Color[hight];
}
(void) jpeg_start_decompress(&cinfo);
row_stride = cinfo.output_width * cinfo.output_components;
buffer = (*cinfo.mem->alloc_sarray)((j_common_ptr) & cinfo, JPOOL_IMAGE, row_stride, 1);
for (int j = 0; j < hight; j++) {
(void) jpeg_read_scanlines(&cinfo, buffer, 1);
for (int i = 0; i < with; i++) {
mat[i][j].r = buffer[0][(i+1) * 3 + 0];
mat[i][j].g = buffer[0][(i+1) * 3 + 1];
mat[i][j].b = buffer[0][(i+1) * 3 + 2];
}
}
(void) jpeg_finish_decompress(&cinfo);
jpeg_destroy_decompress(&cinfo);
fclose(infile);
return true;
}
/*Reading image data from PNG image file*/
bool readpng(FILE **fpp) {
png_structp png_ptr;
png_infop info_ptr;
png_ptr = png_create_read_struct(
PNG_LIBPNG_VER_STRING,
NULL, NULL, NULL);
info_ptr = png_create_info_struct(png_ptr);
setjmp(png_jmpbuf(png_ptr));
rewind(*fpp);
png_init_io(png_ptr, *fpp);
png_read_png(png_ptr, info_ptr, PNG_TRANSFORM_EXPAND, 0);
int channels, color_type;
png_byte bit_depth;
channels = png_get_channels(png_ptr, info_ptr);
color_type = png_get_color_type(png_ptr, info_ptr);
bit_depth = png_get_bit_depth(png_ptr, info_ptr);
with = png_get_image_width(png_ptr, info_ptr);
hight = png_get_image_height(png_ptr, info_ptr);
if (!mat) {
mat = new Color*[with];
for (int i = 0; i < with; i++)
mat[i] = new Color[hight];
} else {
for (int i = 0; i < with; i++) {
delete mat[i];
}
delete mat;
mat = new Color*[with];
for (int i = 0; i < with; i++)
mat[i] = new Color[hight];
}
png_bytepp row_pointers;
row_pointers = png_get_rows(png_ptr, info_ptr);
if(channels == 4 ||
color_type == PNG_COLOR_TYPE_RGB_ALPHA){
for(int i = 0; i < hight; i++)
for(int j = 0; j < with * 4; j += 4){
mat[j/4][i].b = row_pointers[i][j+2];
mat[j/4][i].g = row_pointers[i][j+1];
mat[j/4][i].r = row_pointers[i][j+0];
}
}else if(channels == 3 ||
color_type == PNG_COLOR_TYPE_RGB){
for(int i = 0; i < hight; i++)
for(int j = 0; j < with * 3; j += 3){
mat[j/3][i].b = row_pointers[i][j+2];
mat[j/3][i].g = row_pointers[i][j+1];
mat[j/3][i].r = row_pointers[i][j+0];
}
}else{
png_destroy_read_struct(&png_ptr, &info_ptr, 0);
return false;
}
png_destroy_read_struct(&png_ptr, &info_ptr, 0);
return true;
}
private:
unsigned int with;
unsigned int hight;
T **mat;
};
#endif /* BMAT_H */
边栏推荐
- UEFI development learning 6 - creation of protocol
- UEFI development learning series
- List of linked lists
- STM32 tutorial triple ADC interleaved sampling
- Carrier period, electrical speed, carrier period variation
- Extern keyword function
- Connection mode - bridge and net
- Nb-iot technical summary
- Semiconductor devices (III) FET
- Live555 push RTSP audio and video stream summary (III) flower screen problem caused by pushing H264 real-time stream
猜你喜欢
H264 (I) i/p/b frame gop/idr/ and other parameters
Markdown tips
[tutorial 19 of trio basic from introduction to proficiency] detailed introduction of trio as a slave station connecting to the third-party bus (anybus PROFIBUS DP...)
How to select conductive slip ring
LED display equipment records of the opening ceremony of the Beijing Winter Olympics
Measurement fitting based on Halcon learning [II] meaure_ pin. Hdev routine
UEFI development learning 5 - simple use of protocol
Development tools -- gcc compiler usage
Communication standard -- communication protocol
Semiconductor devices (III) FET
随机推荐
Train your dataset with yolov4
Several implementation schemes of anti reverse connection protection of positive and negative poles of power supply!
Arduino uses nrf24l01+ communication
[untitled] record the visual shock of the Winter Olympics and the introduction of the display screen
Hardware 1 -- relationship between gain and magnification
[trio basic tutorial 17 from getting started to mastering] set up and connect the trio motion controller and input the activation code
1-stm32 operation environment construction
Random function usage notes
C WinForm [exit application] - practice 3
Imx6ull bare metal development learning 1-assembly lit LED
Sql Server的存儲過程詳解
Shape template matching based on Halcon learning [VII] reuse_ model. Hdev routine
L'étude a révélé que le système de service à la clientèle du commerce électronique transfrontalier a ces cinq fonctions!
Zero length array in GNU C
Factors affecting the quality of slip rings in production
Explication de la procédure stockée pour SQL Server
Anonymous structure in C language
Shell脚本基本语法
【云原生 | 从零开始学Kubernetes】三、Kubernetes集群管理工具kubectl
Shape template matching based on Halcon learning [vi] find_ mirror_ dies. Hdev routine