`
love19820823
  • 浏览: 934826 次
文章分类
社区版块
存档分类
最新评论

快速图像像素操作

 
阅读更多

快速图像像素操作

提供了2个API,SetDIBPixelColor和GetDIBPixelColor,

对DIB图像像素快速设置和取得, 以替代系统提供的SetPixel和GetPixel.

SetPixel和GetPixel是基于DC的操作,速度太慢.

// ImageSetPixelFast.cpp : 定义控制台应用程序的入口点。
// cheungmine
#include "stdafx.h"
#include <atlstr.h>
#include <atlimage.h>

// 24位色和16位色转换宏
// by cheungmine
#define RGB888toRGB565(r,g,b) ((WORD)(((WORD(r)<<8)&0xF800)|((WORD(g)<<3)&0x7E0)|((WORD(b) >> 3))))

#define RGBtoRGB565(rgb) ((WORD)(((((WORD)((rgb)>>3))&(0x1F))<<11)|((((WORD)((rgb)>>10))&(0x3F))<<5)|(((WORD)((rgb)>>19))&(0x1F))))

#define RGB888toRGB555(r,g,b) ((WORD)(((WORD(r)<<7)&0x7C00)|((WORD(g)<<2)&0x3E0)|((WORD(b)>>3))))

#define RGBtoRGB555(rgb) ((WORD)(((((WORD)((rgb)>>3))&(0x1F))<<10)|((((WORD)((rgb)>>11))&(0x1F))<<5)|(((WORD)((rgb)>>19))&(0x1F))))

#define RGB555toRGB(rgb555) ((DWORD)(((BYTE)(((rgb555)>>7)&0xF8)|((WORD)((BYTE)(((rgb555)>>2)&0xF8))<<8))|(((DWORD)(BYTE)(((rgb555)<<3)&0xF8))<<16)))

#define RGB565toRGB(rgb565) ((DWORD)(((BYTE)((((rgb565)&0xF800)>>11)<<3)|((WORD)((BYTE)((((rgb565)&0x07E0)>>5)<<2))<<8))|(((DWORD)(BYTE)(((rgb565)&0x001F)<<3))<<16)))


typedef struct
{
void *lpBits;
int width;
int height;
int nBpp;
int nPitch;
int row;
int col;
DWORD dwColor;
}DIBitsDesc;

void SetDIBPixelColor(DIBitsDesc *pDib)
{
if (pDib->nPitch>0){
// top-down DIB
if(pDib->nBpp==16){
int at = -pDib->nPitch*(pDib->row-pDib->height+1)+pDib->col*2;
*((WORD*)(&((BYTE*)pDib->lpBits)[at])) = (WORD) pDib->dwColor;
}
if (pDib->nBpp==24){
int at = -pDib->nPitch*(pDib->row-pDib->height+1)+pDib->col*3;
BYTE* gbr = &((BYTE*)pDib->lpBits)[at];
*gbr++ = GetBValue(pDib->dwColor);
*gbr++ = GetGValue(pDib->dwColor);
*gbr = GetRValue(pDib->dwColor);
}
else if(pDib->nBpp==32){
int at = -pDib->nPitch*(pDib->row-pDib->height+1)+pDib->col*4;
BYTE* gbra = &((BYTE*)pDib->lpBits)[at];
*gbra++ = 0;
*gbra++ = GetBValue(pDib->dwColor);
*gbra++ = GetGValue(pDib->dwColor);
*gbra = GetRValue(pDib->dwColor);
}
}
else{
// bottom-up DIB
if(pDib->nBpp==16){
int at = pDib->nPitch*pDib->row+pDib->col*2;
*((WORD*)(&((BYTE*)pDib->lpBits)[at])) = (WORD) pDib->dwColor;
}
if (pDib->nBpp==24){
int at = pDib->nPitch*pDib->row+pDib->col*3;
BYTE* gbr = &((BYTE*)pDib->lpBits)[at];
*gbr++ = GetBValue(pDib->dwColor);
*gbr++ = GetGValue(pDib->dwColor);
*gbr = GetRValue(pDib->dwColor);
}
else if(pDib->nBpp==32){
int at = pDib->nPitch*pDib->row+pDib->col*4;
BYTE* agbr = &((BYTE*)pDib->lpBits)[at];
*agbr++ = 0;
*agbr++ = GetBValue(pDib->dwColor);
*agbr++ = GetGValue(pDib->dwColor);
*agbr = GetRValue(pDib->dwColor);
}
}
}

void GetDIBPixelColor(DIBitsDesc *pDib)
{
if (pDib->nPitch>0){
// top-down DIB
if(pDib->nBpp==16){
int at = -pDib->nPitch*(pDib->row-pDib->height+1)+pDib->col*2;
pDib->dwColor = *((WORD*)(&((BYTE*)pDib->lpBits)[at]));
}
if (pDib->nBpp==24){
int at = -pDib->nPitch*(pDib->row-pDib->height+1)+pDib->col*3;
BYTE* gbr = &((BYTE*)pDib->lpBits)[at];
pDib->dwColor = RGB(gbr[2], gbr[1], gbr[0]);
}
else if(pDib->nBpp==32){
int at = -pDib->nPitch*(pDib->row-pDib->height+1)+pDib->col*4;
BYTE* agbr = &((BYTE*)pDib->lpBits)[at];
pDib->dwColor = RGB(agbr[2], agbr[1], agbr[0]);
}
}
else{
// bottom-up DIB
if(pDib->nBpp==16){
int at = pDib->nPitch*pDib->row+pDib->col*2;
pDib->dwColor = *((WORD*)(&((BYTE*)pDib->lpBits)[at]));
}
if (pDib->nBpp==24){
int at = pDib->nPitch*pDib->row+pDib->col*3;
const BYTE* gbr = &((BYTE*)pDib->lpBits)[at];
pDib->dwColor = RGB(gbr[2], gbr[1], gbr[0]);
}
else if(pDib->nBpp==32){
int at = pDib->nPitch*pDib->row+pDib->col*4;
const BYTE* agbr = &((BYTE*)pDib->lpBits)[at];
pDib->dwColor = RGB(agbr[2], agbr[1], agbr[0]);
}
}
}

int main(int argc, char* argv[])
{
CImage img;

img.Load("c://greatwall.jpg");

DIBitsDesc dib;

dib.width = img.GetWidth();
dib.height = img.GetHeight();
dib.nBpp = img.GetBPP();
dib.nPitch = img.GetPitch();
dib.lpBits = img.GetBits();

if (img.IsDIBSection())
{
for(int r=0; r<dib.height; r++){
for(int c=0; c<dib.width; c++){
// too slow to use: img.SetPixel(c, r, RGB(0,255,0));
dib.row = r;
dib.col = c;
dib.dwColor = RGB(0,255,0);
SetDIBPixelColor(&dib);
}
}
}

img.Save("c://test2.bmp");

return 0;
}

分享到:
评论

相关推荐

    论文研究-一种基于快速置换和可选择像素扩散的医疗图像加密算法的安全性分析 .pdf

    一种基于快速置换和可选择像素扩散的医疗图像加密算法的安全性分析,禹峰,龚馨慧,最近,Hua等人提出了一种基于快速置换和可选择像素扩散的医疗图像加密方案。加密方案的一个关键操作是插入随机值,然后通过之乱和

    含仿真录像,基于快速引导滤波和焦点像素检测的多焦点图像融合matlab仿真

    3.内容:基于快速引导滤波和焦点像素检测的多焦点图像融合matlab仿真,将两个具有局部模糊的图像进行融合得到一个清晰的图像。 4.运行注意事项:注意MATLAB左侧当前文件夹路径,必须是程序所在文件夹位置,具体可以...

    图像修复.py Python基于OpenCV的图像修复算法

    $FMM$保证那些已知像素周围的像素首先被修复,所以这个就像人工启发式的操作一样。 $OpenCV$提供了两种算法。两者都可以通过相同的函数访问,$cv2.inpaint()$。 第一种算法基于$Alexandru Telea$于2004年...

    MATLAB图形图像处理

    8.7 图像文件的操作 8.7.1 查询图像文件的信息 8.7.2 图像文件的读取 8.7.3 图像文件的存储 8.7.4 图像数据类型的转换 8.7.5 图像文件格式的转换 第九章 MATLAB 图像显示与色彩 9.1 图像显示 9.1.1 imshow ...

    matlab6.5图形图像处理源程序

    8.7 图像文件的操作 8.7.1 查询图像文件的信息 8.7.2 图像文件的读取 8.7.3 图像文件的存储 8.7.4 图像数据类型的转换 8.7.5 图像文件格式的转换 第九章 MATLAB 图像显示与色彩 9.1 图像显示 9.1.1 imshow ...

    基于频域和空域的数字图像复原算法研究

    基于空域的算法直接对图像像素进行操作, 通过正则化项的引入更好地控制噪声, 并采用迭代计算获得了良好的图像复原效果。文中对常规的空域正则化算法进行改进, 构造空域上加权矩阵, 更好地保持图像的边缘和纹理。在...

    《数字图像处理》冈萨雷斯 中文+英文 pdf

    4.11.3快速傅里叶变换(FFT)321 4.11.4关于过滤器设计的一些评论325 摘要325 参考文献和进一步阅读326 问题326 第5章图像恢复和重建333 5.1图像降级/恢复过程的模型334 5.2噪声模型335 5.2.1噪声的空间和频率特性...

    opencv-python:05_图像基础操作(获取像素、图像属性、ROI、通道拆分合并、BGR转RGB、边界填充)

    图像的基础操作 获取像素值并修改 获取图像的属性(信息) 图像的 ROI() 图像通道的拆分及合并 BGR转RGB 图像扩边(边界填充) 一、获取并修改像素值 注意: Numpy 是经过优化了的进行快速矩阵运算的软件包。所以...

    论文研究-二值图像膨胀腐蚀的快速算法.pdf

    传统二值图像膨胀腐蚀算法存在大量冗余操作,运算效率低,制约了大结构元素在实际工程上的应用。提出了一种快速膨胀腐蚀算法。首先针对结构元素建立方向-位置偏移表,然后提取图像的边界,对每一条边界用一个起始点...

    【图像分割】基于matlab超像素快速FCM(SFFCM)彩色图像分割【含Matlab源码 2726期】.zip

    代码下载:完整代码,可直接运行 ;运行版本:2014a或2019b;若运行有问题,可私信博主;...海神之光擅长领域擅长路径规划、优化求解、神经网络预测、图像处理、语音处理等多种领域Matlab仿真,具体代码仿真 私信博主。

    image processing source code for Matlab常用图像处理源码合集

    ch3_3_2:计算输入图像的3×3邻域像素值的最大值(§3.3.2) ch3_4_1:根据指定的坐标选择一个六边形区域(§3.4.1) ch3_4_2:按灰度分割图像中的目标(§3.4.1) ch3_4_3:函数poly2mask的调用格式(§3.4.1) ch3...

    图像处理基础(第2版).[美]Maria Petrou(带详细书签).pdf

    1.0.8 什么是图像中一个像素位置亮度的物理含义? 3 1.0.9 为什么图像常用512×512,256×256,128×128 等来表示? 4 1.0.10 需要多少个比特以存储一幅图像? 5 1.0.11 什么决定了一幅图像的质量? 5 1.0.12 ...

    Android实现图像二值化代码

    Android实现图像二值化的代码,不知为什么灰度化时简单的像素操作不能达到合适的效果(二值化后图片发绿),最后用setSaturation(0)实现。本人刚学Android,代码是模仿其他人的一个反色处理写的。有不成熟的地方望...

    VC++ matlab图像处理

    8.7 图像文件的操作 8.7.1 查询图像文件的信息 8.7.2 图像文件的读取 8.7.3 图像文件的存储 8.7.4 图像数据类型的转换 8.7.5 图像文件格式的转换 第九章 MATLAB 图像显示与色彩 9.1 图像显示 9.1.1 imshow ...

    图形图像处理源程序-matlab6.5图形图像处理源程序.rar

    8.7 图像文件的操作 8.7.1 查询图像文件的信息 8.7.2 图像文件的读取 8.7.3 图像文件的存储 8.7.4 图像数据类型的转换 8.7.5 图像文件格式的转换 第九章 MATLAB 图像显示与色彩 9.1 图像显示 9.1.1 ...

    《数字图像处理》冈萨雷斯 第三版part1(共1-3部分)

    数字图像处理方面的经典教材,中文译本 阮秋琦,阮宇智等译 本书是把图像处理基础... 12.4.1 MATLAB中的串操作  12.4.2 串的匹配  小结 附录A 函数汇总 附录B ICE和MATLAB图形用户界面 附录C M函数 参考文献 索引

    图像去噪KONoise 2.3

    KONoise是一款专业的图像降噪软件,可以在最大程度保留细节下快速有效消除图像噪声。拥有强大的去噪能力的KONoise可以大幅提高数码拍照产品的成像质量,使得您的数码相片更加完美。 本软件很好的消除了不规则的噪声...

    图像降噪KONoise v2.6.1.zip

    KONoise是一款专业的图像降噪软件,可以在最大程度保留细节下快速有效消除图像噪声。拥有强大的去噪能力的KONoise可以大幅提高数码拍照产品的成像质量,使得您的数码相片更加完美。 KONoise很好的消除了不规则...

    图像处理(第二版)章毓晋

    1.0.8 什么是图像中一个像素位置亮度的物理含义?............................................3 1.0.9 为什么图像常用512×512,256×256,128×128 等来表示?........................4 1.0.10 需要多少个比特以...

Global site tag (gtag.js) - Google Analytics