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

本文主要是介绍如何通过编程获取桌面分辨率、操作像素点颜色、保存位图和JPG格式图片,以及图片数据的处理和存储方式,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

本节课在线学习视频(网盘地址,保存后即可免费观看):

​​https://pan.quark.cn/s/c474d087e76f​​

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

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);// 将位图数据保存到 vectorstd::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 的 ​​GetPixel​​ 和 ​​SetPixel​​ 函数操作像素点颜色。
  3. 保存位图和 JPG 格式图片:使用 GDI+ 库保存图片;使用 OpenCV 库简化图片处理。
  4. 图片数据的处理和存储:提取位图数据并保存到文件;使用 OpenCV 读取、处理和存储图片数据。

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

这篇关于如何通过编程获取桌面分辨率、操作像素点颜色、保存位图和JPG格式图片,以及图片数据的处理和存储方式的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1072893

相关文章

大模型研发全揭秘:客服工单数据标注的完整攻略

在人工智能(AI)领域,数据标注是模型训练过程中至关重要的一步。无论你是新手还是有经验的从业者,掌握数据标注的技术细节和常见问题的解决方案都能为你的AI项目增添不少价值。在电信运营商的客服系统中,工单数据是客户问题和解决方案的重要记录。通过对这些工单数据进行有效标注,不仅能够帮助提升客服自动化系统的智能化水平,还能优化客户服务流程,提高客户满意度。本文将详细介绍如何在电信运营商客服工单的背景下进行

基于MySQL Binlog的Elasticsearch数据同步实践

一、为什么要做 随着马蜂窝的逐渐发展,我们的业务数据越来越多,单纯使用 MySQL 已经不能满足我们的数据查询需求,例如对于商品、订单等数据的多维度检索。 使用 Elasticsearch 存储业务数据可以很好的解决我们业务中的搜索需求。而数据进行异构存储后,随之而来的就是数据同步的问题。 二、现有方法及问题 对于数据同步,我们目前的解决方案是建立数据中间表。把需要检索的业务数据,统一放到一张M

关于数据埋点,你需要了解这些基本知识

产品汪每天都在和数据打交道,你知道数据来自哪里吗? 移动app端内的用户行为数据大多来自埋点,了解一些埋点知识,能和数据分析师、技术侃大山,参与到前期的数据采集,更重要是让最终的埋点数据能为我所用,否则可怜巴巴等上几个月是常有的事。   埋点类型 根据埋点方式,可以区分为: 手动埋点半自动埋点全自动埋点 秉承“任何事物都有两面性”的道理:自动程度高的,能解决通用统计,便于统一化管理,但个性化定

无人叉车3d激光slam多房间建图定位异常处理方案-墙体画线地图切分方案

墙体画线地图切分方案 针对问题:墙体两侧特征混淆误匹配,导致建图和定位偏差,表现为过门跳变、外月台走歪等 ·解决思路:预期的根治方案IGICP需要较长时间完成上线,先使用切分地图的工程化方案,即墙体两侧切分为不同地图,在某一侧只使用该侧地图进行定位 方案思路 切分原理:切分地图基于关键帧位置,而非点云。 理论基础:光照是直线的,一帧点云必定只能照射到墙的一侧,无法同时照到两侧实践考虑:关

使用SecondaryNameNode恢复NameNode的数据

1)需求: NameNode进程挂了并且存储的数据也丢失了,如何恢复NameNode 此种方式恢复的数据可能存在小部分数据的丢失。 2)故障模拟 (1)kill -9 NameNode进程 [lytfly@hadoop102 current]$ kill -9 19886 (2)删除NameNode存储的数据(/opt/module/hadoop-3.1.4/data/tmp/dfs/na

异构存储(冷热数据分离)

异构存储主要解决不同的数据,存储在不同类型的硬盘中,达到最佳性能的问题。 异构存储Shell操作 (1)查看当前有哪些存储策略可以用 [lytfly@hadoop102 hadoop-3.1.4]$ hdfs storagepolicies -listPolicies (2)为指定路径(数据存储目录)设置指定的存储策略 hdfs storagepolicies -setStoragePo

HDFS—存储优化(纠删码)

纠删码原理 HDFS 默认情况下,一个文件有3个副本,这样提高了数据的可靠性,但也带来了2倍的冗余开销。 Hadoop3.x 引入了纠删码,采用计算的方式,可以节省约50%左右的存储空间。 此种方式节约了空间,但是会增加 cpu 的计算。 纠删码策略是给具体一个路径设置。所有往此路径下存储的文件,都会执行此策略。 默认只开启对 RS-6-3-1024k

Hadoop集群数据均衡之磁盘间数据均衡

生产环境,由于硬盘空间不足,往往需要增加一块硬盘。刚加载的硬盘没有数据时,可以执行磁盘数据均衡命令。(Hadoop3.x新特性) plan后面带的节点的名字必须是已经存在的,并且是需要均衡的节点。 如果节点不存在,会报如下错误: 如果节点只有一个硬盘的话,不会创建均衡计划: (1)生成均衡计划 hdfs diskbalancer -plan hadoop102 (2)执行均衡计划 hd

使用opencv优化图片(画面变清晰)

文章目录 需求影响照片清晰度的因素 实现降噪测试代码 锐化空间锐化Unsharp Masking频率域锐化对比测试 对比度增强常用算法对比测试 需求 对图像进行优化,使其看起来更清晰,同时保持尺寸不变,通常涉及到图像处理技术如锐化、降噪、对比度增强等 影响照片清晰度的因素 影响照片清晰度的因素有很多,主要可以从以下几个方面来分析 1. 拍摄设备 相机传感器:相机传

【Prometheus】PromQL向量匹配实现不同标签的向量数据进行运算

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Python全栈,前后端开发,小程序开发,人工智能,js逆向,App逆向,网络系统安全,数据分析,Django,fastapi