c# – 当位图是一定大小时,Bitmap.LockBits错误“参数无效”?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了c# – 当位图是一定大小时,Bitmap.LockBits错误“参数无效”?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2419字,纯文字阅读大概需要4分钟。
内容图文
我创建了一个方法,我想采取图像蒙版并将其应用于另一个图像.如果你看一下这个post,你会看到一个帧图像.该帖子中的帧图像是maskingImage,背景图像是imageToMask.遮蔽图像实际上是一个粉红色中心的图像.这是该方法经历的过程:
>屏蔽图像是PNG,要屏蔽的图像是JPG.
>该方法跟踪掩蔽图像并绘制图像以掩盖它.这有助于保持外部透明度不变.
>然后在掩蔽图像下面绘制输出形式,我们将粉红色的颜色透明.
line var bitsimageToMask = imageToMask.LockBits …是我得到错误的地方.如果要屏蔽的图像的宽度或高度小于屏蔽图像,则会出现“参数无效”错误.在使用位图时,我是新手.
public Bitmap RenderMaskedImage(Bitmap maksingImage, Bitmap imageToMask, Point imageToMaskOffset, ImageFormat imageFormat)
{
using (var newImageToMaskGraphic = Graphics.FromImage(imageToMask))
{
newImageToMaskGraphic.DrawImage(imageToMask, imageToMaskOffset);
}
var output = new Bitmap(maksingImage.Width, maksingImage.Height, PixelFormat.Format32bppArgb);
var rect = new Rectangle(0, 0, maksingImage.Width, maksingImage.Height);
var bitsMask = maksingImage.LockBits(rect, ImageLockMode.ReadOnly, PixelFormat.Format32bppArgb);
var bitsimageToMask = imageToMask.LockBits(rect, ImageLockMode.ReadOnly, PixelFormat.Format32bppArgb);
var bitsOutput = output.LockBits(rect, ImageLockMode.WriteOnly, PixelFormat.Format32bppArgb);
unsafe
{
for (int y = 0; y < maksingImage.Height; y++)
{
var ptrMask = (byte*)bitsMask.Scan0 + y * bitsMask.Stride;
var ptrimageToMask = (byte*)bitsimageToMask.Scan0 + y * bitsimageToMask.Stride;
var ptrOutput = (byte*)bitsOutput.Scan0 + y * bitsOutput.Stride;
for (int x = 0; x < maksingImage.Width; x++)
{
ptrOutput[4 * x] = ptrimageToMask[4 * x]; // blue
ptrOutput[4 * x + 1] = ptrimageToMask[4 * x + 1]; // green
ptrOutput[4 * x + 2] = ptrimageToMask[4 * x + 2]; // red
ptrOutput[4 * x + 3] = ptrMask[4 * x + 3]; // alpha
}
}
}
maksingImage.UnlockBits(bitsMask);
imageToMask.UnlockBits(bitsimageToMask);
output.UnlockBits(bitsOutput);
using (var outputGraphic = Graphics.FromImage(output))
{
outputGraphic.DrawImage(maksingImage.ToTransparentColor(255,0,192), 0, 0);
}
return output;
}
解决方法:
原因是你在imageToMask上使用的矩形比位图本身大.
var rect = new Rectangle(0, 0, maksingImage.Width, maksingImage.Height);
var bitsimageToMask = imageToMask.LockBits(rect, ImageLockMode.ReadOnly, PixelFormat.Format32bppArgb);
rect用于指定需要锁定的位图区域.这个rec??t可以与位图相同或更小,但不能更大.
在你的情况下,因为你使用基于你的maskingImage的rect,rect变得比你使用它的位图大,这会给你带来错误.
内容总结
以上是互联网集市为您收集整理的c# – 当位图是一定大小时,Bitmap.LockBits错误“参数无效”?全部内容,希望文章能够帮你解决c# – 当位图是一定大小时,Bitmap.LockBits错误“参数无效”?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。