如何通过编程获取桌面分辨率、操作像素点颜色、保存位图和JPG格式图片,以及图片数据的处理和存储方式

简介: 如何通过编程获取桌面分辨率、操作像素点颜色、保存位图和JPG格式图片,以及图片数据的处理和存储方式

在图形编程中,获取桌面分辨率、操作像素点颜色、保存和处理图片数据是常见任务。本文将介绍如何通过编程实现这些操作,并提供多个代码案例展示具体实现方法。

1. 获取桌面分辨率

获取桌面分辨率是许多图形应用程序的基本需求。我们可以使用 Windows API 来获取桌面分辨率。

案例1:获取桌面分辨率

#include <windows.h>
#include <iostream>
int main() {
    // 获取屏幕分辨率
    int screenWidth = GetSystemMetrics(SM_CXSCREEN);
    int screenHeight = GetSystemMetrics(SM_CYSCREEN);
    std::cout << "Screen Resolution: " << screenWidth << "x" << screenHeight << std::endl;
    return 0;
}

在这个例子中,使用 GetSystemMetrics 函数获取屏幕的宽度 (SM_CXSCREEN) 和高度 (SM_CYSCREEN),并输出屏幕分辨率。

2. 操作像素点颜色

操作像素点颜色通常用于图像处理和计算机视觉。我们可以使用 GDI(图形设备接口)来操作像素点颜色。

案例2:操作像素点颜色

#include <windows.h>
#include <iostream>
int main() {
    // 获取屏幕设备上下文
    HDC hdcScreen = GetDC(NULL);
    // 获取特定像素的颜色
    COLORREF color = GetPixel(hdcScreen, 100, 100);
    BYTE red = GetRValue(color);
    BYTE green = GetGValue(color);
    BYTE blue = GetBValue(color);
    std::cout << "Pixel color at (100, 100): " << "R=" << (int)red << " G=" << (int)green << " B=" << (int)blue << std::endl;
    // 设置特定像素的颜色
    SetPixel(hdcScreen, 100, 100, RGB(255, 0, 0));
    // 释放设备上下文
    ReleaseDC(NULL, hdcScreen);
    return 0;
}

在这个例子中,使用 GetPixel 函数获取屏幕上 (100, 100) 位置像素的颜色,并使用 SetPixel 函数将该像素设置为红色。

3. 保存位图和JPG格式图片

保存图片是图形编程中的重要任务。我们可以使用 GDI+ 库来保存位图和 JPG 格式的图片。

案例3:保存位图图片

#include <windows.h>
#include <gdiplus.h>
#include <iostream>
#pragma comment (lib,"Gdiplus.lib")
int main() {
    // 初始化 GDI+
    Gdiplus::GdiplusStartupInput gdiplusStartupInput;
    ULONG_PTR gdiplusToken;
    Gdiplus::GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);
    // 创建位图
    Gdiplus::Bitmap bitmap(200, 200, PixelFormat32bppARGB);
    Gdiplus::Graphics graphics(&bitmap);
    // 绘制一个红色矩形
    Gdiplus::SolidBrush redBrush(Gdiplus::Color(255, 255, 0, 0));
    graphics.FillRectangle(&redBrush, 50, 50, 100, 100);
    // 保存为 BMP 格式
    CLSID clsidBmp;
    CLSIDFromString(L"{557CF400-1A04-11D3-9A73-0000F81EF32E}", &clsidBmp);
    bitmap.Save(L"output.bmp", &clsidBmp, NULL);
    // 关闭 GDI+
    Gdiplus::GdiplusShutdown(gdiplusToken);
    std::cout << "Bitmap image saved as output.bmp" << std::endl;
    return 0;
}

在这个例子中,我们使用 GDI+ 库创建一个位图,绘制一个红色矩形,并将其保存为 BMP 格式。

案例4:保存JPG格式图片

#include <windows.h>
#include <gdiplus.h>
#include <iostream>
#pragma comment (lib,"Gdiplus.lib")
int main() {
    // 初始化 GDI+
    Gdiplus::GdiplusStartupInput gdiplusStartupInput;
    ULONG_PTR gdiplusToken;
    Gdiplus::GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);
    // 创建位图
    Gdiplus::Bitmap bitmap(200, 200, PixelFormat32bppARGB);
    Gdiplus::Graphics graphics(&bitmap);
    // 绘制一个蓝色矩形
    Gdiplus::SolidBrush blueBrush(Gdiplus::Color(255, 0, 0, 255));
    graphics.FillRectangle(&blueBrush, 50, 50, 100, 100);
    // 保存为 JPG 格式
    CLSID clsidJpg;
    CLSIDFromString(L"{557CF401-1A04-11D3-9A73-0000F81EF32E}", &clsidJpg);
    bitmap.Save(L"output.jpg", &clsidJpg, NULL);
    // 关闭 GDI+
    Gdiplus::GdiplusShutdown(gdiplusToken);
    std::cout << "JPEG image saved as output.jpg" << std::endl;
    return 0;
}

在这个例子中,我们使用 GDI+ 库创建一个位图,绘制一个蓝色矩形,并将其保存为 JPG 格式。

4. 图片数据的处理和存储方式

图片数据的处理和存储在图像处理和计算机视觉中非常重要。我们可以使用位图(Bitmap)数据进行操作。

案例5:处理和存储位图数据

#include <windows.h>
#include <gdiplus.h>
#include <iostream>
#include <vector>
#pragma comment (lib,"Gdiplus.lib")
void SaveBitmapData(const std::vector<BYTE>& bitmapData, int width, int height) {
    BITMAPFILEHEADER fileHeader;
    BITMAPINFOHEADER infoHeader;
    // 填充文件头
    fileHeader.bfType = 0x4D42; // 'BM'
    fileHeader.bfSize = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + bitmapData.size();
    fileHeader.bfReserved1 = 0;
    fileHeader.bfReserved2 = 0;
    fileHeader.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);
    // 填充信息头
    infoHeader.biSize = sizeof(BITMAPINFOHEADER);
    infoHeader.biWidth = width;
    infoHeader.biHeight = height;
    infoHeader.biPlanes = 1;
    infoHeader.biBitCount = 24;
    infoHeader.biCompression = BI_RGB;
    infoHeader.biSizeImage = 0;
    infoHeader.biXPelsPerMeter = 0;
    infoHeader.biYPelsPerMeter = 0;
    infoHeader.biClrUsed = 0;
    infoHeader.biClrImportant = 0;
    // 将数据保存到文件
    FILE* file = fopen("output_data.bmp", "wb");
    if (file != NULL) {
        fwrite(&fileHeader, sizeof(BITMAPFILEHEADER), 1, file);
        fwrite(&infoHeader, sizeof(BITMAPINFOHEADER), 1, file);
        fwrite(bitmapData.data(), 1, bitmapData.size(), file);
        fclose(file);
        std::cout << "Bitmap data saved to output_data.bmp" << std::endl;
    } else {
        std::cerr << "Failed to save bitmap data" << std::endl;
    }
}
int main() {
    // 初始化 GDI+
    Gdiplus::GdiplusStartupInput gdiplusStartupInput;
    ULONG_PTR gdiplusToken;
    Gdiplus::GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);
    // 创建位图
    int width = 200;
    int height = 200;
    Gdiplus::Bitmap bitmap(width, height, PixelFormat24bppRGB);
    Gdiplus::Graphics graphics(&bitmap);
    // 绘制一个绿色矩形
    Gdiplus::SolidBrush greenBrush(Gdiplus::Color(255, 0, 255, 0));
    graphics.FillRectangle(&greenBrush, 50, 50, 100, 100);
    // 提取位图数据
    Gdiplus::BitmapData bitmapData;
    Gdiplus::Rect rect(0, 0, width, height);
    bitmap.LockBits(&rect, Gdiplus::ImageLockModeRead, PixelFormat24bppRGB, &bitmapData);
    // 将位图数据保存到 vector
    std::vector<BYTE> data(bitmapData.Stride * height);
    memcpy(data.data(), bitmapData.Scan0, data.size());
    // 解锁位图
    bitmap.UnlockBits(&bitmapData);
    // 将数据保存到文件
    SaveBitmapData(data, width, height);
    // 关闭 GDI+
    Gdiplus::GdiplusShutdown(gdiplusToken);
    return 0;
}

在这个例子中,我们通过 LockBits 方法提取位图数据,并将其存储到一个 vector<BYTE> 中。然后,我们调用 SaveBitmapData 函数将数据保存到 BMP 文件中。SaveBitmapData 函数创建 BMP 文件头和信息头,并将位图数据写入到文件。

5. 图片数据的处理和存储

图片数据的处理和存储方式在图像处理中至关重要。我们可以使用不同的库和技术来处理和存储图片数据,例如 OpenCV 或 GDI+。

案例6:使用 OpenCV 处理和存储图片

OpenCV 是一个强大的计算机视觉库,提供了丰富的图像处理功能。

#include <opencv2/opencv.hpp>
#include <iostream>
int main() {
    // 创建一个空白图像
    cv::Mat image = cv::Mat::zeros(cv::Size(200, 200), CV_8UC3);
    // 绘制一个红色矩形
    cv::rectangle(image, cv::Point(50, 50), cv::Point(150, 150), cv::Scalar(0, 0, 255), -1);
    // 保存为 BMP 格式
    cv::imwrite("output_opencv.bmp", image);
    // 保存为 JPG 格式
    cv::imwrite("output_opencv.jpg", image);
    // 显示图像
    cv::imshow("Image", image);
    cv::waitKey(0);
    std::cout << "Image saved as output_opencv.bmp and output_opencv.jpg" << std::endl;
    return 0;
}

在这个例子中,我们使用 OpenCV 创建一个空白图像,并绘制一个红色矩形。然后,我们将图像保存为 BMP 和 JPG 格式,并显示图像。OpenCV 的 imwrite 函数使得保存图像变得非常简单。

案例7:图片数据的存储和读取

我们可以使用 OpenCV 读取和存储图片数据,并进行进一步处理。

#include <opencv2/opencv.hpp>
#include <iostream>
#include <vector>
int main() {
    // 读取图像
    cv::Mat image = cv::imread("output_opencv.jpg");
    if (image.empty()) {
        std::cerr << "Failed to load image" << std::endl;
        return -1;
    }
    // 提取图像数据
    std::vector<uchar> imageData;
    if (image.isContinuous()) {
        imageData.assign(image.datastart, image.dataend);
    } else {
        for (int i = 0; i < image.rows; ++i) {
            imageData.insert(imageData.end(), image.ptr<uchar>(i), image.ptr<uchar>(i) + image.cols * image.channels());
        }
    }
    // 将图像数据保存到文件
    FILE* file = fopen("output_image_data.dat", "wb");
    if (file != NULL) {
        fwrite(imageData.data(), 1, imageData.size(), file);
        fclose(file);
        std::cout << "Image data saved to output_image_data.dat" << std::endl;
    } else {
        std::cerr << "Failed to save image data" << std::endl;
    }
    return 0;
}

在这个例子中,我们使用 OpenCV 读取图像,并提取图像数据到一个 vector<uchar> 中。然后,我们将图像数据保存到一个二进制文件 output_image_data.dat 中。通过这种方式,我们可以存储原始图像数据,方便后续处理和分析。

6. 总结

本文详细介绍了如何通过编程获取桌面分辨率、操作像素点颜色、保存位图和 JPG 格式图片,以及图片数据的处理和存储方式。通过这些案例,希望能够帮助你更好地理解和应用图形编程中的各种技术。

主要点总结:

  1. 获取桌面分辨率:使用 GetSystemMetrics 获取屏幕分辨率。
  2. 操作像素点颜色:使用 GDI 的 GetPixelSetPixel 函数操作像素点颜色。
  3. 保存位图和 JPG 格式图片:使用 GDI+ 库保存图片;使用 OpenCV 库简化图片处理。
  4. 图片数据的处理和存储:提取位图数据并保存到文件;使用 OpenCV 读取、处理和存储图片数据。

通过合理运用这些技术,可以大大提高图形编程的效率和代码的可维护性。在实际开发中,选择合适的库和方法,根据具体需求进行优化和改进,将能够显著提升图形应用程序的性能和用户体验。

目录
相关文章
|
Ubuntu 定位技术 API
python 通过图片(原图)精确获取图片拍摄的位置,时间,设备等信息
python 通过图片(原图)精确获取图片拍摄的位置,时间,设备等信息
python 通过图片(原图)精确获取图片拍摄的位置,时间,设备等信息
pillow 压缩和放大图片 改变图片的像素
pillow 压缩和放大图片 改变图片的像素
|
3月前
|
算法 Java API
在VC++中使用CxImage库读写图像实现像素操作
在VC++中使用CxImage库读写图像实现像素操作
31 0
|
4月前
|
XML 算法 Java
Android App开发之位图加工Bitmap中转换位图的像素色彩、裁剪内部区域、利用矩阵变换位图的讲解及实战(附源码和演示)
Android App开发之位图加工Bitmap中转换位图的像素色彩、裁剪内部区域、利用矩阵变换位图的讲解及实战(附源码和演示)
48 0
|
人工智能
将 JPEG 和 PNG 位图转换为 SVG 矢量图,可无限放大
将 JPEG 和 PNG 位图转换为 SVG 矢量图,可无限放大
283 0
【图片操作】混合图片
混合图片的方式有很多种,我们先来看看如何通过混合图片的通道来实现图片混合。
146 0
|
计算机视觉
OpenCV 读写图像、读写像素、修改像素值(案例:图像反处理)
OpenCV 读写图像、读写像素、修改像素值(案例:图像反处理)
555 0
OpenCV 读写图像、读写像素、修改像素值(案例:图像反处理)
|
编解码 Windows
R中输出常见位图和矢量图格式总结
R语言有两大主要功能,绘图和统计,R的绘图功能是很强大的,在R里绘制好图形后常常需要输出图形。 图形常见的格式有位图和矢量图,位图又包括TIFF、BMP、JPEG、PNG等;矢量图包括PDF、VMF、SVG等。 今天就来学习R中怎么导出常见的位图和矢量图形。
1848 0
R中输出常见位图和矢量图格式总结
|
API Android开发
【Android 内存优化】自定义组件长图组件 ( 获取图像宽高 | 计算解码区域 | 设置图像解码属性 复用 像素格式 | 图像绘制 )
【Android 内存优化】自定义组件长图组件 ( 获取图像宽高 | 计算解码区域 | 设置图像解码属性 复用 像素格式 | 图像绘制 )
164 0
【Android 内存优化】自定义组件长图组件 ( 获取图像宽高 | 计算解码区域 | 设置图像解码属性 复用 像素格式 | 图像绘制 )
|
算法 Linux C语言
RGB源数据操作: 实现图片放大、缩小
RGB源数据操作: 实现图片放大、缩小
323 0
RGB源数据操作: 实现图片放大、缩小