如何用matlab读取gif每一帧图像的像素值

如何用matlab读取gif每一帧图像的像素值,第1张

想得到其中的图像像素值可以这样干:

clc;close all;clear all

info = imfinfo('3gif');%第一次读取,用于获取属性值

W = infoWidth;

H = infoHeight;

W = W(1);

H = H(1);

len = length(info);

figure('NumberTitle', 'off', 'ToolBar', 'none', 'Menu', 'none');

pos = get(gcf, 'position');

set(gcf, 'position', [pos(1) pos(2) W H]);

set(gca, 'position', [0 0 1 1]);

hold on;

for i = 1 : len

str=sprintf('photo%djpg',i);

[Ii, map] = imread('3gif', 'frames', i);

imwrite(Ii,str,'jpg');

F(:, i) = im2frame(flipud(Ii), map);

end

movie(F, 20);

close;

方法一:获取的宽高。可以用offsetWidth和offsetHeight;

方法二:

你先获取img标签标签元素。用getElementById()或者getElementsByClassName或者getElementsByTagName()都可以。

获取之后,如果你的img有width和height 属性,可以直接用img元素对象点属性

documentgetElementsByTagName("img")[0]width;

documentgetElementsByTagName("img")[0]height;

3如果img元素本身没有width和height属性。你可以获取img元素的style样式

function getStyle(obj,attr){

return objcurrentStyleobjcurrentStyle[attr]:getComputedStyle(obj)[attr];

};

obj是你的img标签对象,attr是你的想要获取的属性;

currentStyle支持IE低版本浏览器,

getComputedStyle支持主流浏览器

以acd看图为例:

在默认状态下,选中后,在状态栏会显示图像的信息,有图像KB大小也有长宽尺寸,

不过这样一个一个查看太慢了,按Alt + O快捷键或者选择工具菜单>选项,打开选项设置窗口,

选择左侧文件列表>缩略图显示,再点击右侧的缩略图信息

在d出的选取缩略图显示信息中展开图像属性:勾图像大小,展开文件属性:勾选大小(KB)

点击添加按钮,添加到当前显示明细中,点击确定,返回选项窗口,点击确定。

看缩略图下面很清楚的显示出了图像大小,也就是长宽像素值,还有KB大小。

制作游戏时,我们最常用的格式是png,因为png可以有透明的背景,这样在游戏显示是,透明的部分不会显示,只显示我们要的那部分。但是,透明的部分依然是的一部分,当你制作了一个非矩形的按钮,会有相当多的透明部分点击有效,那么如何做到点击透明部分无效呢?这就是本片文章要讲的:获取图像像素值。当然不仅仅在制作非矩形按钮时有用,在游戏中的很多涉及处理功能的地方也大有用途。

废话不多说,直接贴源码(Cocos2d-x 3x版本):

HelloWorldSceneh文件

HelloWorldScenecpp文件:

在GetRGBA函数中,调用了OpenGL的接口glReadPixels,它用于读取一些像素。当前可以简单理解为“把已经绘制好的像素(它可能已经被保存到显卡的显存中)读取到内存”。

glReadPixels函数总共有七个参数。前四个参数可以得到一个矩形,该矩形所包括的像素都会被读取出来。(第一、二个参数表示了矩形的左下角横、纵坐标,坐标以窗口最左下角为零,最右上角为最大值;第三、四个参数表示了矩形的宽度和高度)

第五个参数表示读取的内容,例如:GL_RGB就会依次读取像素的红、绿、蓝三种数据,GL_RGBA则会依次读取像素的红、绿、蓝、alpha四种数据,GL_RED则只读取像素的红色数据(类似的还有GL_GREEN,GL_BLUE,以及GL_ALPHA)。如果采用的不是RGBA颜色模式,而是采用颜色索引模式,则也可以使用GL_COLOR_INDEX来读取像素的颜色索引。目前仅需要知道这些,但实际上还可以读取其它内容,例如深度缓冲区的深度数据等。

第六个参数表示读取的内容保存到内存时所使用的格式,例如:GL_UNSIGNED_BYTE会把各种数据保存为GLubyte,GL_FLOAT会把各种数据保存为GLfloat等。

第七个参数表示一个指针,像素数据被读取后,将被保存到这个指针所表示的地址。注意,需要保证该地址有足够的可以使用的空间,以容纳读取的像素数据。例如一幅大小为256256的图象,如果读取其RGB数据,且每一数据被保存为GLubyte,总大小就是:2562563 = 196608字节,即192千字节。如果是读取RGBA数据,则总大小就是2562564 = 262144字节,即256千字节。

注意:glReadPixels实际上是从缓冲区中读取数据,如果使用了双缓冲区,则默认是从正在显示的缓冲(即前缓冲)中读取,而绘制工作是默认绘制到后缓冲区的。因此,如果需要读取已经绘制好的像素,往往需要先交换前后缓冲。

CImage m_image;//m_image就是要处理的图像

int bit=m_ImageGetBPP();//获取每点像素的位数(8,24,32等),如果只处理24位图,则bit可直接赋值为24

int width=m_ImageGetWidth();//图像的宽度(单位为像素)

int height=m_ImageGetHeight();//图像的长度(单位为像素)

HBITMAP bitmap = m_ImageDetach();//

CBitmap b_Image=CBitmap::FromHandle(bitmap);//获取CBitmap类的实例

DWORD totalbytes=widthheightbit/8;//要保存像素数据需要的总的字节数,24位图的话,每个像素需要3个字节

byte lpBits=new byte[totalbytes];//字节型数组,每个单位存一个字节的数据

int bytes=b_Image->GetBitmapBits(totalbytes,lpBits);//把像素数据存到数组lpBits里,通过看bytes是否为0可以知道是否成功,为0则没有成功

//接下来遍历数组即可获取像素数据,因为24位图是3个字节构成一个像素,所以遍历时要注意间隔。

1,加载一张,使用GDI+的Bitmap类,创建一个对象,Bitmap bitmap=Bitmap::FromFile("examplepng");

2,从Bitmap对象中获得HBITMAP句柄,HBITMAP句柄指向位图,

HBITMAP hBMP; bitmap->GetHBITMAP(NULL,hBMP);

3,从句柄中找到位图结构体,位图结构体(BITMAP)包含了关于位图的所有信息

BITMAP bitmap; GetObject(hBMP,sizeof(BITMAP),&bitmap);

4,参照BITMAP结构体,就能得到你要的字节数组

bitmapbmBits;

不过得到的不一定是字节数组,因为图像有的用3个字节表示一个像素,有的是一个位标识一个像素。

关于图像像素值,我想要先讲一下Java中如何组织一个图像对象BufferedImage的,

一个BufferedImage的像素数据储存在Raster中,ColorModel里面储存颜色空间,类型等

信息,当前Java只支持一下三种图像格式- JPG,PNG,GIF,如何向让Java支持其它格式,首

先要 完成Java中的图像读写接口,然后打成jar,加上启动参数- Xbootclasspath/p

newimageformatIOjar即可。

取得BufferedImage的代码如下:

File file = new File("D:\\test\\blue_flowerjpg");

BufferedImage image = ImageIOread(file);

取得像素使用getRGB,代码如下:

int type= imagegetType();

if ( type ==BufferedImageTYPE_INT_ARGB || type == BufferedImageTYPE_INT_RGB )

return (int [])imagegetRaster()getDataElements(x, y, width, height, pixels );

else

return imagegetRGB( x, y, width, height, pixels, 0, width );

写入像素,才可能用到getRaster,在type为ARGB 或RGB时,必须使用getRaster()setDataElements方式设置,其他格式直接setRGB,代码如下:

int type= imagegetType();

if ( type ==BufferedImageTYPE_INT_ARGB || type == BufferedImageTYPE_INT_RGB )

imagegetRaster()setDataElements(x, y, width, height, pixels );

else

imagesetRGB(x, y, width, height, pixels, 0, width );

以上就是关于如何用matlab读取gif每一帧图像的像素值全部的内容,包括:如何用matlab读取gif每一帧图像的像素值、如何在JS中获取图片的像素、如何获得图片的宽高像素数等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/9392862.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-27
下一篇 2023-04-27

发表评论

登录后才能评论

评论列表(0条)

保存