No.2_1 FreeImage——旋转图像

概述

该程序使用 FreeImage 来对图像执行旋转操作。FreeImage 是一款免费的开源图形库,它可以用于 Windows,Linux 和 Mac OS X 系统。完整的源代码参见 No.1_FreeImage

实现

1.获取位图格式

FREE_IMAGE_FORMAT format = FreeImage_GetFileType(image_name);

从位图文件获取位图格式。该函数从位图文件中读取 16 字节内容并对其分析,从而得到位图格式。返回值 FREE_IMAGE_FORMAT 在加载或存储位图文件时,用于标识位图格式,可以是下面的常量值:

FIFDescription
FIF_UNKNOWNUnknown format (returned value only, never use it as input value)
FIF_BMPWindows or OS/2 Bitmap File (*.BMP)
FIF_CUTDr. Halo (*.CUT)
FIF_DDSDirectDraw Surface (*.DDS)
FIF_EXRILM OpenEXR (*.EXR)
FIF_FAXG3Raw Fax format CCITT G3 (*.G3)
FIF_GIFGraphics Interchange Format (*.GIF)
FIF_HDRHigh Dynamic Range (*.HDR)
FIF_ICOWindows Icon (*.ICO)
FIF_IFFAmiga IFF (.IFF, .LBM)
FIF_J2KJPEG-2000 codestream (.J2K, .J2C)
FIF_JNGJPEG Network Graphics (*.JNG)
FIF_JP2JPEG-2000 File Format (*.JP2)
FIF_JPEGIndependent JPEG Group (.JPG, .JIF, .JPEG, .JPE)
FIF_JXRJPEG XR image format (.JXR, .WDP, *.HDP)
FIF_KOALACommodore 64 Koala format (*.KOA)
FIF_MNGMultiple Network Graphics (*.MNG)
FIF_PBMPortable Bitmap (ASCII) (*.PBM)
FIF_PBMRAWPortable Bitmap (BINARY) (*.PBM)
FIF_PCDKodak PhotoCD (*.PCD)
FIF_PCXZsoft Paintbrush PCX bitmap format (*.PCX)
FIF_PFMPortable Floatmap (*.PFM)
FIF_PGMPortable Graymap (ASCII) (*.PGM)
FIF_PGMRAWPortable Graymap (BINARY) (*.PGM)
FIF_PICTMacintosh PICT (.PCT, .PICT, *.PIC)
FIF_PNGPortable Network Graphics (*.PNG)
FIF_PPMPortable Pixelmap (ASCII) (*.PPM)
FIF_PPMRAWPortable Pixelmap (BINARY) (*.PPM)
FIF_PSDAdobe Photoshop (*.PSD)
FIF_RASSun Rasterfile (*.RAS)
FIF_RAWRAW camera image (many extensions)
FIF_SGISilicon Graphics SGI image format (*.SGI)
FIF_TARGATruevision Targa files (.TGA, .TARGA)
FIF_TIFFTagged Image File Format (.TIF, .TIFF)
FIF_WBMPWireless Bitmap (*.WBMP)
FIF_WEBPGoogle WebP image format (*.WEBP)
FIF_XBMX11 Bitmap Format (*.XBM)
FIF_XPMX11 Pixmap Format (*.XPM)

2.加载位图文件

FIBITMAP *bitmap = FreeImage_Load(format, image_name);
if (bitmap == NULL) {
        perror("bitmap load fail");
        exit(EXIT_FAILURE);
}

加载位图文件,解析位图属性,并为位图分配内存,返回 FIBITMAP 对象。第一个参数定义被加载的位图类型,当传递 FIF_BMP 作为参数时,表示 BMP 位图文件被加载到内存;第二个参数指向被加载的位图文件位置。

3.格式转换

bitmap = FreeImage_ConvertTo32Bits(bitmap);

将位图格式转换为 32 位字节流,返回的位图对象是输入位图的拷贝,已经转换为 32 位位图。实际上转换后的 32 位位图对象指向新的内存区域,该内存区域可能比原始位图指向的内存区域要大。由于后续操作使用 32 位位图对象,原来的位图对象需要使用 FreeImage_Unload 来释放资源。

4.旋转图像

bitmap = FreeImage_RotateEx(bitmap, 30.0, 0, 0, x_orig, y_orig, TRUE);

对 8 位灰度,24 或 32 位图像执行旋转或平移操作,旋转后的图像保持原始图像的宽度和高度。

  • angle:表示旋转的角度。注意,这里以角度为单位,而在三角函数中参数通常以弧度为单位;
  • x_shift/y_shift:水平方向和垂直方向图像平移的大小,以像素为单位;
  • x_origin/y_origin:旋转中心。旋转时图像绕着旋转中心以 CCW 方向(逆时针)旋转,旋转中心的表示也以像素为单位;
  • use_mask:当 use_mask 设置为 TRUE,图像外的部分设置为黑色,否则按照镜像技术来设置图像外部分的颜色。

当同时设置了旋转和平移时,实验表明图像是先执行旋转操作后再平移。

函数 FreeImage_Rotate 和 FreeImage_RotateEx 类似,也执行旋转操作。不同的是该函数旋转后的图像大小和原始图像大小并不一致,而是保持一定的长宽比,通常会变得更大。因此,函数 FreeImage_Rotate 更适用于对图像旋转 90 度、180度和 270 度时的场景。

5.转换类型

bitmap = FreeImage_ConvertToType(bitmap_temp, FIT_BITMAP);

将图像从一种类型转换为另一种类型。这里将 32 位字节流转换为位图格式。FREE_IMAGE_TYPE 用来指定 FIBITMAP 的位图类型(数据类型),可以是下面的常量值:

FIFDescription
FIF_UNKNOWNUnknown format (returned value only, never use it as input value)
FIT_BITMAPStandard image: 1-, 4-, 8-, 16-, 24-, 32-bit
FIT_UINT16Array of unsigned short: unsigned 16-bit
FIT_INT16Array of short: signed 16-bit
FIT_UINT32Array of unsigned long: unsigned 32-bit
FIT_INT32Array of long: signed 32-bit
FIT_FLOATArray of float: 32-bit IEEE floating point
FIT_DOUBLEArray of double: 64-bit IEEE floating point
FIT_COMPLEXArray of FICOMPLEX: 2 x 64-bit IEEE floating point
FIT_RGB1648-bit RGB image: 3 x unsigned 16-bit
FIT_RGBA1664-bit RGBA image: 4 x unsigned 16-bit
FIT_RGBF96-bit RGB float image: 3 x 32-bit IEEE floating point
FIT_RGBAF28-bit RGBA float image: 4 x 32-bit IEEE floating point

当需要获取位图的数据类型时,可使用 FreeImage_GetImageType 来获取位图的数据类型。

6.保存文件

FreeImage_Save(format, bitmap, "lenna_target.png");

将位图对象 FIBITMAP 保存到指定的文件中。第一个参数表示位图对应的格式。例如,当传递的参数是 FIF_BMP 时,则保存为 bmp 文件格式;第二个指向将要保存的位图对象;最后一个参数指定存储的文件名。

7.释放内存

FreeImage_Unload(bitmap)

从内存中删除前面加载的 FIBITMAP 对象。一个位图对象是对地址空间中某个内存区域的引用。

结果

该程序运行后,显示效果如下图所示:

原始图像

旋转后图像

参考

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
对于JPEG图片的无损优化,可以使用FreeImage库来实现。FreeImage是一个开源的图像处理库,支持多种图像格式的读取、处理和输出。 以下是使用FreeImage对JPEG进行无损优化的Java代码示例: ```java import java.io.File; import java.io.IOException; import org.freeimage.FreeImage; import org.freeimage.FreeImageIO; import org.freeimage.FreeImageLoader; import org.freeimage.FreeImageRuntimeException; public class JpegOptimizeDemo { public static void main(String[] args) { try { // 读取JPEG图片 FreeImage image = FreeImageLoader.load(FreeImage.Format.JPEG, new File("test.jpg").getPath(), 0); // 获取JPEG图片的压缩参数 FreeImage.SetMetadataKeyValue(image, "JPEG_QUALITY", "100"); // 保存优化后的JPEG图片 FreeImageIO.setWriteFlags(FreeImageIO.JPEG_QUALITYSUPERB); FreeImage.Save(FreeImage.Format.JPEG, image, new File("test_optimized.jpg").getPath(), 0); // 释放内存 FreeImage.Unload(image); } catch (IOException | FreeImageRuntimeException e) { e.printStackTrace(); } } } ``` 在上述代码中,先使用FreeImageLoader.load方法读取JPEG图片,然后使用FreeImage.SetMetadataKeyValue方法获取JPEG图片的压缩参数,再使用FreeImage.Save方法将优化后的JPEG图片保存到文件中。最后使用FreeImage.Unload方法释放内存。 需要注意的是,FreeImage库需要在系统中预先安装,并在Java项目中添加FreeImage.jar文件。此外,FreeImage库支持的图像格式较多,可根据需要选择合适的图像格式进行优化。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值