92 lines
2.5 KiB
Markdown
92 lines
2.5 KiB
Markdown
# LibIMG
|
|
|
|
_A "powerful" library that I have worked on allowing you to take a PPM image and apply filters and transformations and download the file. It also works for JPEG which you can also convert to PPM and vice versa_
|
|
|
|
> [Note]
|
|
> All documentation is in the code and files itself. So to save myself time I would recommend going through the code itself.
|
|
|
|
> [Warning]
|
|
> There are a lot of changes you can make to an image but this is not an extensive library to use mainstream. I would hope you understood that already. This Is for a self made project learning bitwise for c originally and now has become bigger and cooler than expected.
|
|
|
|
## Installation
|
|
|
|
_You can pull libimg through FetchContent in your ```CMakeLists.txt```:_
|
|
|
|
|
|
```Make
|
|
include(FetchContent)
|
|
FetchContent_Declare(imgproc
|
|
GIT_REPOSITORY https://git.moomancer.xyz/DarthMooMancer/libimg.git
|
|
GIT_TAG main
|
|
GIT_SHALLOW TRUE
|
|
)
|
|
FetchContent_MakeAvailable(imgproc)
|
|
target_link_libraries(libgl PRIVATE imgproc)
|
|
```
|
|
|
|
## Example
|
|
|
|
_White it is not an extensive example, it shows many of the many logic of how to use all functions throughout the codebase._
|
|
|
|
```c
|
|
/*
|
|
* Keep in mind any function that creates a new buffer and returns it can
|
|
* overwrite the old one, however it is lost. SO create a new variable and free
|
|
* the old one after use.
|
|
*/
|
|
int
|
|
main()
|
|
{
|
|
// Init base image containers
|
|
PPM img;
|
|
JPEG jimg;
|
|
|
|
// Add a file location of image to modify
|
|
img.name = "../assets/test_2.ppm";
|
|
|
|
// Load the PPM image
|
|
unsigned int* buf = ppm_load(img.name, &img);
|
|
|
|
// Check for null image load. In case image doesnt exist or fails to
|
|
// load
|
|
if (!buf)
|
|
{
|
|
LOGERROR(ERR_BUF_NULL);
|
|
return ERR_BUF_NULL;
|
|
}
|
|
|
|
// Blur image and save to new pointer
|
|
unsigned int* blur = box_blur(buf, &img, 20);
|
|
|
|
// Free old buffer. MUST DO THIS. Maybe not immediately but before
|
|
// ending or possibly leaking. Also it stays in heap and a large image
|
|
// can take a lot of memory so better to clear anyways.
|
|
free(buf);
|
|
|
|
// Check for null image load. In case image doesnt exist or fails to
|
|
// load
|
|
if (!blur)
|
|
{
|
|
LOGERROR(ERR_BUF_NULL);
|
|
return ERR_BUF_NULL;
|
|
}
|
|
|
|
// Loop image and apply filter to each pixel.
|
|
for (int i = 0; i < img.len; i++)
|
|
{
|
|
blur[i] = u32_rotl(blur[i], 4);
|
|
}
|
|
|
|
// Take the attributes from ppm image so jpeg file can be saved
|
|
jimg = inherit_from_ppm(&img);
|
|
|
|
// Saves jpeg to location specified
|
|
jpeg_save(blur, &jimg, "../assets/test_2_new.jpg");
|
|
|
|
// Make sure to free any buffer still active
|
|
free(blur);
|
|
|
|
return 0;
|
|
}
|
|
```
|