当前位置:首页 > 芯闻号 > 充电吧
[导读]主要在之前的解码的基础上面添加了图片缩放功能。大家可以看看BMP解码过程或者思路。资料网上非常多,在此就不在说明,直接上代码。BMPdecode.c/*************************

主要在之前的解码的基础上面添加了图片缩放功能。

大家可以看看BMP解码过程或者思路。

资料网上非常多,在此就不在说明,直接上代码。


BMPdecode.c


/*************************************************************************************************************
 * 文件名:	bmpdecode.c
 * 功能:		BMP图片软件解码
 * 作者:		cp1300@139.com
 * 创建时间:	2012年12月7日20:30
 * 最后修改时间:2012年12月9日
 * 详细:		只支持非压缩的BMP,16bit,24bit,32bit
 * 			图片文件最大由BMP_MAX_BUFF决定
 * 			因为使用了FATFS,以及比较多的临时变量,内联函数可能需要比较大的堆栈
 * 			因为添加了图片缩放功能,因此程序比以前的效率稍微低下了一点,主要是因为画点的时候需要判断了
*************************************************************************************************************/
#include "tft_lcd.h"
#include "system.h"
#include "bmpdecode.h"
#include "ff.h"


//图片缓冲区,目前定义为10MB,也就意味着最大只能打开10MB的位图文件
#define BMP_MAX_BUFF  10*1024*1024			//定义缓冲区最大大小
static u8 BmpImageBuff[BMP_MAX_BUFF];				//图片缓冲区
//显示窗口的最大值,一般定义为显示器大小
#define LCD_MAX_WIDTH		800	//最大宽度
#define LCD_MAX_HEIGHT		480	//最大高度


//图像数据压缩类型,目前只支持没有压缩的位图
#define BI_RGB       0	//没有压缩
#define BI_RLE8      1	//每个象素8比特的RLE压缩编码,压缩格式由2字节组成(重复象素计数和颜色索引)
#define BI_RLE4      2	//每个象素4比特的RLE压缩编码,压缩格式由2字节组成
#define BI_BITFIELDS 3	//每个象素的比特由指定的掩码决定


//16,24,32位BMP文件头部信息结构
typedef  struct
{
	u16 Invalid;		//无效的填充字节,用于让数据对齐
 	u16 bfType ; 		//文件标志.只对'BM',用来识别BMP位图类型
	u32 bfSize ; 		//文件大小,占四个字节
	u32 bfReserved1 ;	//保留
	u32 bfOffBits ; 	//从文件开始到位图数据(bitmap data)开始之间的的偏移
	u32 bmfHeaderSize;	//图像描述信息块的大小,常为28H
	u32 biWidth ; 		//说明图象的宽度,以象素为单位
	u32 biHeight ; 		//说明图象的高度,以象素为单位
	u16 biPlanes ; 		//为目标设备说明位面数,其值将总是被设为1
	u16 biBitCount ; 	//说明比特数/象素,其值为1、4、8、16、24、或32
	u32 biCompression ; //说明图象数据压缩的类型。其值可以是下述值之一:
						//BI_RGB:没有压缩;
						//BI_RLE8:每个象素8比特的RLE压缩编码,压缩格式由2字节组成(重复象素计数和颜色索引);
						//BI_RLE4:每个象素4比特的RLE压缩编码,压缩格式由2字节组成
						//BI_BITFIELDS:每个象素的比特由指定的掩码决定。
	u32 biSizeImage ;	//说明图象的大小,以字节为单位。当用BI_RGB格式时,可设置为0
	u32 biXPelsPerMeter ;//说明水平分辨率,用象素/米表示
	u32 biYPelsPerMeter ;//说明垂直分辨率,用象素/米表示
	u32 biClrImportant ; //说明对图象显示有重要影响的颜色索引的数目,如果是0,表示都重要。
}BMPFILEHEADER;


//BMP图片相关的信息结构
struct BMP_IMAGE
{
	u16 bfOffBits ; 	//从文件开始到位图数据(bitmap data)开始之间的的偏移
	u16 biWidth ; 		//说明图象的宽度,以象素为单位
	u16 biHeight ; 		//说明图象的高度,以象素为单位
	u16	biBitCount ; 	//说明比特数/象素,其值为1、4、8、16、24、或32
	u32 biSizeImage;	//位图数据的大小
	u32 biSizeFile;		//位图文件大小
}BmpFile;


//图像信息
struct BMPPIC_POS
{			 
	u32 ImgWidth;		//图像的实际宽度和高度
	u32 ImgHeight;

	u32 Div_Fac;		//图像缩放系数(扩大了10000倍)
	
	u32 S_Height;		//设定的显示高度和宽度
	u32 S_Width;
	
	u32	S_XOFFSET;		//X,Y起始偏移量
	u32 S_YOFFSET;

	u32 staticx;		//当前显示的X,Y坐标
	u32 staticy;
}BMPPICINFO;



//内部函数声明
static BMP_ERROR OpenBmpFile(const char *FileName,u8 *buff,u32 FileMaxSize);		//打开BMP图像,并将数据读取到内存
__inline u8 ReadByteData(u32 Offset);												//读取一字节指定偏移的图片数据
static BMP_ERROR DecodingHead(u8 *FileBuff);										//解码BMP图片头部
__inline void BmpImageDrow(u16 x,u16 y,u16 data);									//BMP图像画点函数
static BMP_ERROR BmpDecode(u16 x1,u16 y1,u16 x2,u16 y2,u8 *BmpBuff);				//BMP图像解码核心
static void ImageDrow_Init(void);													//BMP画点函数初始化





/*************************************************************************************************************************
*函数        	:	static BMP_ERROR OpenBmpFile(const char *FileName,u8 *buff,u32 FileMaxSize)
*功能        	:	打开BMP图像,并将数据读取到内存
*参数        	:	FileName:文件名,路径指针;buff:读取缓冲区;FileMaxSize:文件最大限制
*返回        	:	BMP_ERROR
*依赖     	: 	FATFS文件系统支持
*作者        	:	cp1300@139.com
*时间     	:	20121207
*最后修改时间	:	20121207
*说明     	:	调用FATFS打开BMP图片文件
*************************************************************************************************************************/
static BMP_ERROR OpenBmpFile(const char *FileName,u8 *buff,u32 FileMaxSize)
{
	FIL file;
	UINT cnt;
	int status;
	BMP_ERROR error = BMP_OK;

	status = f_open(&file,FileName,FA_READ);				//只读方式打开文件
	if(status != FR_OK)										//打开文件错误
	{
		uart_printf("open "%s" error!rn",FileName);
		status = BMP_OPEN_ERROR;
	}
	else
	{
		//获取文件大小
		uart_printf("file size : %dBrn",file.fsize);		//输出文件大小
		if(file.fsize > FileMaxSize)
		{
			uart_printf("file size > %drn",FileMaxSize);
			status = BMP_SIZE_ERROR;
			
		}
		else
		{
			status = f_read(&file,buff,file.fsize,&cnt);	//读取文件
			uart_printf("Read File Num=%drn",cnt);
			if(cnt == file.fsize)							//判断文件是否读取完毕
			{
				uart_printf("read file end!rn");
				BmpFile.biSizeFile = file.fsize;			//存储位图文件大小
				status =  BMP_OK;
			}
			else
			{
				uart_printf("read file error!rn");
				status = BMP_READ_ERROR;
			}
		}
	}
	f_close(&file);
	return error;
}


/*************************************************************************************************************************
*函数        	:	__inline u8 ReadByteData(u32 Offset)
*功能        	:	读取一字节指定偏移的图片数据
*参数        	:	Offset:地址偏移
*返回        	:	数据
*依赖     	: 	无
*作者        	:	cp1300@139.com
*时间     	:	20121207
*最后修改时间	:	20121207
*说明     	:	方便移植
*************************************************************************************************************************/
__inline u8 ReadByteData(u32 Offset)
{
	return BmpImageBuff[Offset];
}




/*************************************************************************************************************************
*函数        	:	static BMP_ERROR DecodingHead(u8 *FileBuff)
*功能        	:	解码BMP图片头部
*参数        	:	*FileBuff:bmp图像数据缓冲区指针
*返回        	:	BMP_ERROR
*依赖     	: 	static BMP_ERROR OpenBmpFile(const char *FileName,u8 *buff,u32 FileMaxSize)
*作者        	:	cp1300@139.com
*时间     	:	20121207
*最后修改时间	:	20121207
*说明     	:	注意BMP的头部信息并没有按照32BIT对齐,在前面插了两个字节后即可对齐,非对齐访问会发生异常
*************************************************************************************************************************/
static BMP_ERROR DecodingHead(u8 *FileBuff)
{
	BMP_ERROR error = BMP_OK;
	u8 buff[52];
	u8 cnt;
	BMPFILEHEADER *pbmp;//临时指针,用于获取BMP文件的头部信息
	u8 *p = buff + 2;	//BMP头部共50字节,前面的两个字节用于偏移对齐

	for(cnt = 0;cnt < 50;cnt ++)
	{
		p[cnt] = FileBuff[cnt];		//复制(读取)头部到缓冲区
	}
	pbmp = (BMPFILEHEADER*)buff;			//得到BMP的头部信息
	BmpFile.bfOffBits = pbmp->bfOffBits; 	//位图数据偏移地址偏移
	BmpFile.biBitCount = pbmp->biBitCount;	//位图数据的颜色深度只支持16bit,24bit,32bit
	BmpFile.biWidth = pbmp->biWidth;		//位图的水平像素数
	BmpFile.biHeight = pbmp->biHeight;		//位图的垂直像素数
	BmpFile.biSizeImage = pbmp->biSizeImage;//位图的数据大小,有的图片这个值为0
	/****************************************************/
	//调试
	uart_printf("地址偏移:%drn",BmpFile.bfOffBits);
	uart_printf("颜色深度:%drn",BmpFile.biBitCount);
	uart_printf("水平分辨率:%drn",BmpFile.biWidth);
	uart_printf("垂直分辨率:%drn",BmpFile.biHeight);
	uart_printf("数据大小:%drn",BmpFile.biSizeImage);
	uart_printf("位图标志:%Xrn",pbmp->bfType);
	/****************************************************/
	if(pbmp->bfType == 0x4d42)	//检测位图头部信息
	{
		if((BmpFile.biBitCount != 16) && (BmpFile.biBitCount != 24) && (BmpFile.biBitCount != 32))
			error = BMP_TYPE_ERROR;
		else
			error = BMP_OK;
	}
	else
		error = BMP_TYPE_ERROR;

	return error;
}



/*************************************************************************************************************************
*函数        	:	__inline void BmpImageDrow(u16 x,u16 y,u16 data)
*功能        	:	BMP图像画点函数
*参数        	:	x,y:xy坐标,data:RGB565数据
*返回        	:	无
*依赖     	: 	无
*作者        	:	cp1300@139.com
*时间     	:	20121207
*最后修改时间	:	20121207
*说明     	:	因为进行缩放的时候,有些点不用进行显示
*************************************************************************************************************************/
__inline void BmpImageDrow(u16 x,u16 y,u16 data)
{				  
	if(x != BMPPICINFO.staticx || y != BMPPICINFO.staticy)
	{
		BMPPICINFO.staticx = x;
		BMPPICINFO.staticy = y;
		LCD_DrawPoint(x+BMPPICINFO.S_XOFFSET,y+BMPPICINFO.S_YOFFSET,data);
	}
}



/*************************************************************************************************************************
*函数        	:	static BMP_ERROR BmpDecode(u16 x1,u16 y1,u16 x2,u16 y2,u8 *BmpBuff)
*功能        	:	BMP图像解码核心
*参数        	:	x1,y1:窗口起始坐标;x2,y2:窗口结束坐标;BmpBuff:图像缓冲区指针
*返回        	:	BMP_ERROR
*依赖     	: 	需要先解码头信息
*作者        	:	cp1300@139.com
*时间     	:	20121207
*最后修改时间	:	20121209
*说明     	:	解码图像
*************************************************************************************************************************/
static BMP_ERROR BmpDecode(u16 x1,u16 y1,u16 x2,u16 y2,u8 *BmpBuff)
{
	BMP_ERROR error = BMP_OK;

	u32 data;		//存放24BIT图片的一个像素颜色值
	u32 bmp_cnt;	//已经读取的照片数据计数

	u16 uiTemp;	  	//x轴方向实际存储的像素数据字节数
	u16 xValid;		//x轴方向有效的像素数据字节数
	u16 xcnt; 		//X轴方向像素点数据字节数计数
	u16 x,y;		//画点坐标
	u8 temp;

	if((BmpFile.biWidth * BmpFile.biBitCount / 8) % 4)//水平像素字节数不是4的整数倍
		uiTemp = ((BmpFile.biWidth * BmpFile.biBitCount / 8) / 4 + 1) * 4;//将水平像素字节数扩展成4的整数倍
	else
		uiTemp = BmpFile.biWidth * BmpFile.biBitCount / 8;
	xValid = BmpFile.biWidth * (BmpFile.biBitCount / 8);	//计算水平有效地数据字节数
	y = BMPPICINFO.ImgHeight - 1;							//BMP图片由左下角到右上角刷新,因此起点y坐标要加上图片的高度
	x = 0;
	bmp_cnt = BmpFile.bfOffBits;//将文件数据开始赋值给数据计数器
	xcnt = 0;		//X方向像素点计数器清零
	do
	{
		switch (BmpFile.biBitCount)//判断图片颜色深度
		{
			case 32: //32BIT   ARGB8888  //之所以使用一个字节读取一方面方便移植到内存较小的单片机上面执行,另一方面避免内存非对齐访问产生异常。
			{
				data = ReadByteData(bmp_cnt++);
				temp = ReadByteData(bmp_cnt++);
				data |= temp << 8;
				temp = ReadByteData(bmp_cnt++);
				data |= temp << 16;
				bmp_cnt ++;
				data = RGB565(data);	//RGB888 ---> RGB565
			}break;
			case 24: //24BIT RGB888	//可能存在4字节对齐问题
			{
				data = ReadByteData(bmp_cnt++);
				temp = ReadByteData(bmp_cnt++);
				data |= temp << 8;
				temp = ReadByteData(bmp_cnt++);
				data |= temp << 16;
				xcnt += 3;
				data = RGB565(data);	//RGB888 ---> RGB565
			}break;
			case 16: //16BIT  RGB555 //可能存在4字节对齐问题
			{
				data = ReadByteData(bmp_cnt++);
				temp = ReadByteData(bmp_cnt++);
				data |= temp << 8;
				xcnt += 2;	
				data = ((data & 0xffe0) << 1) | (data & 0x001f);//RGB555  --->  RGB565
				data |= ((data & BIT6) ? BIT5 : 0);
			};break;
			default : break;//只支持16BIT,24BIT,32BIT图片的解码
		}

		switch(BMPPICINFO.Div_Fac)
		{
			case 10000	:	BmpImageDrow(x,y,data);break;													//图片无需缩放
			default		:	BmpImageDrow(x*BMPPICINFO.Div_Fac/10000,y*BMPPICINFO.Div_Fac/10000,data);break;	//图片需要缩放
		}

		x ++;
		if(x == BMPPICINFO.ImgWidth)				//一行解码完成,换行
		{
			x = 0;
			if(y == 0) break;
			y --;
		}
		if(xcnt == xValid)							//插值,无效数据,跳过
		{
			bmp_cnt += uiTemp - xcnt;
			xcnt = 0;
		}
	}while(bmp_cnt  < BmpFile.biSizeFile);			//判断数据是否读取完毕
	
	uart_printf("bmp_cnt = 0x%X; BmpFile.biSizeFile = 0x%Xrn",bmp_cnt,BmpFile.biSizeFile);
	
	return error;
}



/*************************************************************************************************************************
*函数        	:	static void ImageDrow_Init(void)
*功能        	:	BMP画点函数初始化
*参数        	:	无
*返回        	:	无
*依赖     	: 	无
*作者        	:	cp1300@139.com
*时间     	:	20121207
*最后修改时间	:	20121209
*说明     	:	用于计算显示坐标以及缩放系数
*************************************************************************************************************************/
static void ImageDrow_Init(void)
{
	float temp,temp1;
	
	BMPPICINFO.ImgWidth = BmpFile.biWidth;		//获取图像实际宽度
	BMPPICINFO.ImgHeight = BmpFile.biHeight;	//获取图像实际高度
	temp=(float)BMPPICINFO.S_Width / BMPPICINFO.ImgWidth;
	temp1=(float)BMPPICINFO.S_Height / BMPPICINFO.ImgHeight;
	if(temp < temp1) temp1 = temp;			//取较小的那个边的缩放系数
	if(temp1 > 1) temp1 = 1;				//不能放大,原图大小显示
	BMPPICINFO.Div_Fac = temp1 * 10000;		//将缩放系数扩大10000倍
	//计算偏移,将图片置于显示区域的起始位置
	BMPPICINFO.S_XOFFSET += (BMPPICINFO.S_Width - temp1 * BMPPICINFO.ImgWidth) / 2;	
	BMPPICINFO.S_YOFFSET += (BMPPICINFO.S_Height - temp1 * BMPPICINFO.ImgHeight) / 2;
	//将当前显示坐标放到一个不可能的值上面
	BMPPICINFO.staticx = 0xffff;
	BMPPICINFO.staticy = 0xffff;
}



/*************************************************************************************************************************
*函数        	:	BMP_ERROR ShowBmpImage(u16 x1,u16 y1,u16 x2,u16 y2,const char *BmpFile)
*功能        	:	指定位置显示一张BMP图片
*参数        	:	x1,y1:窗口起始坐标;x2,y2:窗口结束坐标;BmpFile:BMP文件路径以及名称
*返回        	:	BMP_ERROR
*依赖     	: 	static BMP_ERROR BmpDecode(u16 x1,u16 y1,u16 x2,u16 y2,u8 *BmpBuff)
*作者        	:	cp1300@139.com
*时间     	:	20121207
*最后修改时间	:	20121207
*说明     	:	直接在LCD上面显示一张BMP图片,需要FATFS支持
* 				当结束窗口坐标为0的时候结束坐标自动换成屏幕结束坐标
*************************************************************************************************************************/
BMP_ERROR ShowBmpImage(u16 x1,u16 y1,u16 x2,u16 y2,const char *BmpFile)
{
	BMP_ERROR error;
	
	BMPPICINFO.S_Width = (((x2 - x1 + 1) > LCD_MAX_WIDTH) || (x2 == 0)) ? (LCD_MAX_WIDTH-x1): (x2 - x1 + 1);	//计算设定的显示宽度和高度
	BMPPICINFO.S_Height = (((y2 - y1 + 1) > LCD_MAX_HEIGHT) || (y2 == 0)) ? (LCD_MAX_HEIGHT-y1): (y2 - y1 + 1);
	BMPPICINFO.S_XOFFSET = x1;																					//初始化偏移为起始坐标
	BMPPICINFO.S_YOFFSET = y1;
	error = OpenBmpFile(BmpFile,BmpImageBuff,BMP_MAX_BUFF);
	if(error == BMP_OK)
	{
		error = DecodingHead(BmpImageBuff);
		if(error == BMP_OK)
		{		
			ImageDrow_Init();
			error = BmpDecode(x1,y1,x2,y2,BmpImageBuff);
		}
	}
	return error;
}


bmpdecode.h



/*************************************************************************************************************
 * 文件名:	bmpdecode.h
 * 功能:		BMP图片软件解码
 * 作者:		cp1300@139.com
 * 创建时间:	2012年12月7日20:30
 * 最后修改时间:2012年12月9日
 * 详细:		只支持非压缩的BMP,16bit,24bit,32bit
 * 			图片文件最大由BMP_MAX_BUFF决定
 * 			因为使用了FATFS,以及比较多的临时变量,内联函数可能需要比较大的堆栈
*************************************************************************************************************/
#ifndef BMPDECODE_H_
#define BMPDECODE_H_

//BMP错误定义
typedef enum
{
	BMP_OK			=	0,	//正常处理完成
	BMP_OPEN_ERROR	=	1,	//图像打开错误
	BMP_READ_ERROR	=	2,	//图像读取错误
	BMP_SIZE_ERROR  = 	3,	//图像大小错误
	BMP_TYPE_ERROR  = 	4,	//不支持的图像类型,图像类型错误
	BMP_OTHER_ERROR	=	5	//其它未知错误
} BMP_ERROR;


BMP_ERROR ShowBmpImage(u16 x1,u16 y1,u16 x2,u16 y2,const char *BmpFile);	//指定位置显示一张BMP图片


#endif /*BMPDECODE_H_*/


main.c



#include "system.h"
#include "uart.h"
#include "tft_lcd.h"
#include "other.h"
#include "delay.h"
#include "timer.h"
#include "ff.h"
#include "rtc.h"
#include "bmpdecode.h"
#include "jpeg.h"



u8 jpeg_buff[10*1024*1024];
u8 buff[10*1024*1024];


FATFS fs;

//LED1闪烁程序,在定时器0中断服务程序中闪烁,周期400MS
void LED1_flash(void)
{
	LED1_FLASH();
}



void PrintfDirFile(void)
{
	int result;
	DIR DirInf;  
	FILINFO FileInf;
	int cnt;

	
	result = f_opendir(&DirInf, "/"); /* 如果不带参数,则从当前目录开始 */
	if (result != FR_OK) 
	{
		lcd_printf("Root Directory is Open Error (%d)n", result);
	}
	/* 读取当前文件夹下的文件和目录 */
	lcd_printf("Name             Tyepe         Sizen");
	for (cnt = 0; ;cnt++) 
	{
		result = f_readdir(&DirInf,&FileInf); 		/* 读取目录项,索引会自动下移 */
		if (result != FR_OK || FileInf.fname[0] == 0)
		{
			break;
		}
		if (FileInf.fname[0] == '.')
		{
			continue;
		}
		lcd_printf("%s  ", FileInf.fname);
		if (FileInf.fattrib == AM_DIR)
		{
			lcd_printf("Directory ");
		} 
		else 
		{
			lcd_printf("File  ");	
		}
		lcd_printf("%dn", FileInf.fsize);
	}
}



//主函数
int main(void)
{	
	int result;
	
	LCD_Init();									//初始化LCD
	UART0_Init(DISABLE,115200);					//初始化串口,失能中断接收,波特率115200
	LED_Init();									//初始化LED
	Timer1_Init(400000-1,ENABLE,LED1_flash);	//初始化定时器1,周期400ms
	RTC_Init(ENABLE);							//初始化RTC时钟
	JPEG_Init();								//初始化JPEG解码器
	
	
	result = disk_initialize (DISK_SDMMC);		//初始化磁盘
	if(result == RES_OK)
	{
		lcd_printf("Disk Init OK!n");
		result = f_mount(DISK_SDMMC,&fs);
		if(result == FR_OK)
		{
			lcd_printf("Mount Disk OK!n");
			PrintfDirFile();						//打印根目录下的文件
			ShowBmpImage(0,0,0,0,"bmp24.BMP");		//显示全屏图片
			ShowBmpImage(200,200,0,0,"bmp24.BMP");	//显示缩小的图片
		}
		else
		{
			lcd_printf("Mount Disk ERROR(%d)!n",result);
		}
	}
	else
	{
		lcd_printf("Disk Init ERROR(%d)!n",result);
	}
	
	
	while(1)
	{
		LED2_FLASH();		//LED2闪烁
		Delay_US(600000);
		//lcd_printf("%d-%d-%d %d:%dn",Timer.w_year,Timer.w_month,Timer.w_date,Timer.hour,Timer.min);
	}
}





开发板上面的效果图



本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

9月2日消息,不造车的华为或将催生出更大的独角兽公司,随着阿维塔和赛力斯的入局,华为引望愈发显得引人瞩目。

关键字: 阿维塔 塞力斯 华为

加利福尼亚州圣克拉拉县2024年8月30日 /美通社/ -- 数字化转型技术解决方案公司Trianz今天宣布,该公司与Amazon Web Services (AWS)签订了...

关键字: AWS AN BSP 数字化

伦敦2024年8月29日 /美通社/ -- 英国汽车技术公司SODA.Auto推出其旗舰产品SODA V,这是全球首款涵盖汽车工程师从创意到认证的所有需求的工具,可用于创建软件定义汽车。 SODA V工具的开发耗时1.5...

关键字: 汽车 人工智能 智能驱动 BSP

北京2024年8月28日 /美通社/ -- 越来越多用户希望企业业务能7×24不间断运行,同时企业却面临越来越多业务中断的风险,如企业系统复杂性的增加,频繁的功能更新和发布等。如何确保业务连续性,提升韧性,成...

关键字: 亚马逊 解密 控制平面 BSP

8月30日消息,据媒体报道,腾讯和网易近期正在缩减他们对日本游戏市场的投资。

关键字: 腾讯 编码器 CPU

8月28日消息,今天上午,2024中国国际大数据产业博览会开幕式在贵阳举行,华为董事、质量流程IT总裁陶景文发表了演讲。

关键字: 华为 12nm EDA 半导体

8月28日消息,在2024中国国际大数据产业博览会上,华为常务董事、华为云CEO张平安发表演讲称,数字世界的话语权最终是由生态的繁荣决定的。

关键字: 华为 12nm 手机 卫星通信

要点: 有效应对环境变化,经营业绩稳中有升 落实提质增效举措,毛利润率延续升势 战略布局成效显著,战新业务引领增长 以科技创新为引领,提升企业核心竞争力 坚持高质量发展策略,塑强核心竞争优势...

关键字: 通信 BSP 电信运营商 数字经济

北京2024年8月27日 /美通社/ -- 8月21日,由中央广播电视总台与中国电影电视技术学会联合牵头组建的NVI技术创新联盟在BIRTV2024超高清全产业链发展研讨会上宣布正式成立。 活动现场 NVI技术创新联...

关键字: VI 传输协议 音频 BSP

北京2024年8月27日 /美通社/ -- 在8月23日举办的2024年长三角生态绿色一体化发展示范区联合招商会上,软通动力信息技术(集团)股份有限公司(以下简称"软通动力")与长三角投资(上海)有限...

关键字: BSP 信息技术
关闭
关闭