My God,CImage裁剪图片变成黑色了

2023-05-16

一直以来,用CImage裁剪图片,代码如下:

CImage img;
if (FAILED(img.Load(strFileFrom)))
    return;

int imgH = img.GetHeight();
int imgW = img.GetWidth();
int bpp = img.GetBPP();

// 裁剪内部左上的1/4位置的一块小图
int x1 = imgW/4;
int y1 = imgH/4;
int w = x1;
int h = y1;

CImage imgDest;
imgDest.Create(w, h, bpp);
img.BitBlt(imgDest.GetDC(), 0, 0, w, h, x1, y1, SRCCOPY);
imgDest.Save(strNewFileName, Gdiplus::ImageFormatJPEG);

这个代码一直工作正常,但是今天反馈说裁出来的图片很多都是黑色的,我仔细查看了一下,裁剪的位置没有错,原图片也正常,在img.Load()之后,可以正常显示出来。

然后我再用裁出来的小图imgDest显示,发现是黑色的,仔细跟踪裁剪的位置和尺寸,确实和预期的一样,也没有超出图片的尺寸。

再仔细查看原图片的属性,发现其是8位的,但是裁剪出来的图片看属性,显示是24位。然后去网上搜索关于CImage对8位图像处理的问题,原来需要设置调色板,修改后的代码如下(中间加了个调色板的设置):

CImage img;
if (FAILED(img.Load(strFileFrom)))
    return;

int imgH = img.GetHeight();
int imgW = img.GetWidth();
int bpp = img.GetBPP();

// 裁剪内部左上的1/4位置的一块小图
int x1 = imgW/4;
int y1 = imgH/4;
int w = x1;
int h = y1;

CImage imgDest;
imgDest.Create(w, h, bpp);

if (bpp == 8)
{
	/*
	如果是8位,则必需使用调色板,否则出来的图像就是黑色的
	在拷贝图像之前,要先设置调色板,如果是先拷贝再设置,则没有任何效果
    这里不管它没有深入研究,只是直接按照256个值进行拷贝
	*/
	RGBQUAD colorTable[256];
	img.GetColorTable(0, 256, colorTable);
	imgDest.SetColorTable(0, 256, colorTable);
}

img.BitBlt(imgDest.GetDC(), 0, 0, w, h, x1, y1, SRCCOPY);
imgDest.Save(strNewFileName, Gdiplus::ImageFormatJPEG);
img.BitBlt(imgDest.GetDC(), 0, 0, w, h, x1, y1, SRCCOPY);
imgDest.Save(strNewFileName, Gdiplus::ImageFormatJPEG);

在加了调色板之后,保存的图片正常了

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

My God,CImage裁剪图片变成黑色了 的相关文章

  • 2021-04-03

    Java代码 importjava util Scanner public classTest public static voidmain String args p br Scanner scan 61 newScanner Syste
  • 2021年寒假

    2022年1月4日 周二 雨雪 主要内容 xff1a 测试学校周雄短路的板子 xff0c 焊接新板子 上午11 00开始 xff0c 首先准备好电源 xff0c 热风枪 xff0c 前一天晚上已经改完的板子 第一次上电 测得最终输出5v 1
  • JavaScript 异步编程

    异步的概念 异步 xff08 Asynchronous async xff09 是与同步 xff08 Synchronous sync xff09 相对的概念 在我们学习的传统单线程编程中 xff0c 程序的运行是同步的 xff08 同步不
  • InnoDB引擎--存储结构与文件

    数据库是数据的集合 xff0c 数据库管理系统 xff08 DBMS xff09 是操作和管理数据库的应用程序 数据库应用主要有两类 xff1a OLAP xff08 联机分析处理 xff09 和OLTP xff08 联机事务处理 xff0
  • conda安装包出现CondaHTTPError: HTTP 000 CONNECTION FAILED for url问题

    win10本地利用conda install package时出现的问题 Fetching package metadata CondaHTTPError HTTP 000 CONNECTION FAILED for url lt http
  • NVM 切换Node版本不成功(nvm提示成功,实际Node版本未切换)

    一 背景 xff1a 因为接手了一个旧项目 xff0c node依赖版本对应不上 xff0c 于是想到用NVM切换下对应版本 xff0c 二 问题 xff1a xff08 先安装Node xff0c 后安装Nvm下 xff09 由于以前就安
  • STM32F103C8T6读取气压计MS5611,I2C读取模式

    笔者最近想用气压计模块来测一下相对高度 xff0c 使用的元器件如下图所示 所使用的最小系统板 所使用的气压计模块 其实读取还是蛮简单的 xff0c 根据核心板引脚图选择I2c接口 xff0c 然后借鉴正点原子的模拟i2c程序 xff0c
  • Linux(Ubuntu20.04)安装JDK

    简单易懂 xff0c 小学生都学会了 xff01 操作系统 xff1a Windows11 子系统 xff1a Linux xff08 Ubuntu20 04 xff09 JDK版本 xff1a openjdk8 前言 最近手痒了 xff0
  • Spring自定义AOP

    我们在学习Spring的时候 xff0c 总是会看到Spring对于AOP的支持 xff0c 这同IOC一起 xff0c 属于Spring的两大核心 既然是核心 xff0c 这AOP又有哪些应用场景呢 xff1f 相信很多小伙伴都知道 xf
  • Spring Boot全局异常处理

    前言 全局异常处理可以帮助我们拦截接口的报错 xff0c 返回调用方友好的提示 xff0c 提高了用户体验的同时 xff0c 还为我们排查异常提供了便利 那么如何定义一个全局异常处理呢 xff1f 它又是怎样帮助我们处理异常 xff0c 并
  • MySQL查询JSON字段匹配

    前言 MySQL从5 7版本开始 xff0c 引入了JSON类型字段 xff0c 这使我们可以在MySQL数据库中存储JSON格式的数据 xff0c 并保留其对象格式 xff0c 再也不用转成字符串类型保存了 xff0c 减少了许多字符串类
  • 常用的conda命令

    目录 一 conda vs pip 二 conda命令 1 conda list 2 conda install 3 conda remove 4 conda update 5 conda create 6 conda config 7 c
  • 借助ChatGPT编写html小程序

    在数值模拟过程中 xff0c 经常需要反复计算一些参数 xff0c 例如常见的无量纲参数雷诺数和瑞利数等 它们的表达式如下 xff1a R a 61 g

随机推荐