.net 处理图片亮度
在网上搜索到一段代码,其中需要unsafe模式使用指针移动来操作修改图片数据!
重新修改使用Marshal类来替换处理unsafe代码段,代码如下 c++/cli,C#的直接按照语法修改下就可以了!
Bitmap^ UpdateImageLight(Bitmap^ bmp,int degree)
{
if(bmp==nullptr)
return nullptr;
if(degree<-255)
degree=-255;
if (degree>255)
degree=255;
try{
Rectangle rect = Rectangle(0,0,bmp->Width,bmp->Height);
BitmapData^ bmpData = bmp->LockBits( rect, ImageLockMode::ReadWrite,PixelFormat::Format24bppRgb);//24位rgb模式,一个像素点有3 byte数据
IntPtr ptr = bmpData->Scan0; //bmpData数据段首地址
int bytes = bmpData->Stride * bmp->Height;
array<Byte>^rgbValues = gcnew array<Byte>(bytes);
System::Runtime::InteropServices::Marshal::Copy( ptr, rgbValues, 0, bytes ); //复制ptr指针开始的 bytes大小数据到 rgbValue
int offset = bmpData->Stride - bmp->Width * 3;
int k = 0,pix=0;
for (int y = 0; y < bmp->Height; y++)
{
for (int x = 0; x < bmp->Width; x++)
{
// 处理指定位置像素的亮度
for (int i = 0; i < 3; i++)
{
pix = rgbValues[k+i] + degree;
if (degree < 0) rgbValues[k+i] = (Byte)Math::Max(0, pix);
if (degree > 0) rgbValues[k+i] = (Byte)Math::Min(255, pix);
}
k += 3;
}
k += offset;
}
System::Runtime::InteropServices::Marshal::Copy( rgbValues, 0, ptr, bytes );//处理过的数据复制回原地址
bmp->UnlockBits(bmpData);
return bmp;
}
catch(Exception^ ex)
{
return nullptr;
}
}
{
if(bmp==nullptr)
return nullptr;
if(degree<-255)
degree=-255;
if (degree>255)
degree=255;
try{
Rectangle rect = Rectangle(0,0,bmp->Width,bmp->Height);
BitmapData^ bmpData = bmp->LockBits( rect, ImageLockMode::ReadWrite,PixelFormat::Format24bppRgb);//24位rgb模式,一个像素点有3 byte数据
IntPtr ptr = bmpData->Scan0; //bmpData数据段首地址
int bytes = bmpData->Stride * bmp->Height;
array<Byte>^rgbValues = gcnew array<Byte>(bytes);
System::Runtime::InteropServices::Marshal::Copy( ptr, rgbValues, 0, bytes ); //复制ptr指针开始的 bytes大小数据到 rgbValue
int offset = bmpData->Stride - bmp->Width * 3;
int k = 0,pix=0;
for (int y = 0; y < bmp->Height; y++)
{
for (int x = 0; x < bmp->Width; x++)
{
// 处理指定位置像素的亮度
for (int i = 0; i < 3; i++)
{
pix = rgbValues[k+i] + degree;
if (degree < 0) rgbValues[k+i] = (Byte)Math::Max(0, pix);
if (degree > 0) rgbValues[k+i] = (Byte)Math::Min(255, pix);
}
k += 3;
}
k += offset;
}
System::Runtime::InteropServices::Marshal::Copy( rgbValues, 0, ptr, bytes );//处理过的数据复制回原地址
bmp->UnlockBits(bmpData);
return bmp;
}
catch(Exception^ ex)
{
return nullptr;
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架