【问题标题】:Overlaying PNG images KEEPING transparency叠加PNG图像保持透明度
【发布时间】:2014-05-21 02:53:43
【问题描述】:

所以基本上我想要做的是重叠两个具有透明背景的 .PNG 图像。一个是带有旋转到鼠标位置的霰弹枪,另一个是我想放在霰弹枪后面的卡通人物。现在,问题是每次我重叠它们时,PNG 图像的透明背景都会挡住我的视线,我根本看不到射手。

我曾尝试将射手放在面板中,但将霰弹枪图片框放在其中会破坏旋转算法(使其旋转非常缓慢),我不知道为什么。

任何帮助将不胜感激,谢谢。

我使用的编码: 旋转算法:

private Bitmap rotateImage(Bitmap b, float angle)
{
    //create a new empty bitmap to hold rotated image
    Bitmap returnBitmap = new Bitmap(b.Width, b.Height);
    //make a graphics object from the empty bitmap
    Graphics g = Graphics.FromImage(returnBitmap);
    //move rotation point to center of image
    g.TranslateTransform((float)b.Width / 2, (float)b.Height / 2);
    //rotate
    g.RotateTransform((int)angle);
    //move image back
    g.TranslateTransform(-(float)b.Width / 2, -(float)b.Height / 2);
    //draw passed in image onto graphics object
    g.DrawImage(b, new Point(0, 0)); //???
    return returnBitmap;
}

private float CalcAngle(Point TargetPos)
{
    Point ZeroPoint = new Point(pictureBox1.Location.X + pictureBox1.Width / 2, pictureBox1.Location.Y + pictureBox1.Height / 2);
    if (TargetPos == ZeroPoint)
    {
        return 0;
    }

    double angle;
    double deltaX, deltaY;

    deltaY = TargetPos.Y - ZeroPoint.Y;
    deltaX = TargetPos.X - ZeroPoint.X;

    angle = Math.Atan2(deltaY, deltaX) * 180 / Math.PI;
    return (float)angle;
}

private void timer1_Tick(object sender, EventArgs e)
{
    pictureBox1.Image = (Bitmap)backup.Clone();
    //Load an image in from a file
    Image image = new Bitmap(pictureBox1.Image);
    //Set our picture box to that image
    pictureBox1.Image = (Bitmap)backup.Clone();

    //Store our old image so we can delete it
    Image oldImage = pictureBox1.Image;
    //Set angle
    angle = CalcAngle(new Point(Cursor.Position.X, Cursor.Position.Y - 10));
    //Pass in our original image and return a new image rotated X degrees right
    pictureBox1.Image = rotateImage((Bitmap)image, angle);
    if (oldImage != null)
    {
        oldImage.Dispose();
        image.Dispose();
    }
}

【问题讨论】:

  • 附上你目前尝试过的一些代码sn-ps
  • 我已经提出了旋转算法,至于透明度的事情,我还没有实现任何代码(我在表单编辑器中做的面板事情)。

标签: c# png transparency


【解决方案1】:

当您创建新的位图时,请尝试使用 32 bpp 或 64 bpp 的任何像素格式。请看下面的代码:

Bitmap returnBitmap = new Bitmap(b.Width, b.Height, PixelFormat.Format64bppPArgb);

【讨论】:

    【解决方案2】:

    在这里,我将三个不同的 png 文件叠加在一个面板上:

    using (Graphics graphic = panel1.CreateGraphics())
    {
      using (Image image = Image.FromFile(@"D:\tp3.png")) graphic.DrawImage(image, Point.Empty);
      using (Image image = Image.FromFile(@"D:\tp2.png")) graphic.DrawImage(image, Point.Empty);
      using (Image image = Image.FromFile(@"D:\tp1.png")) graphic.DrawImage(image, Point.Empty);
    }
    

    如果您按照@Palak.Maheria 所说的那样创建一个新的位图,并使用带有 alpha 通道的 32 位格式!

    【讨论】:

    • 谢谢 :) 不得不对 DrawImage 功能进行更多研究,我没有使用面板,但您的回答很有帮助。问候:)
    猜你喜欢
    • 1970-01-01
    • 2013-04-11
    • 2012-03-29
    • 2011-10-14
    • 2012-05-29
    • 2011-08-21
    • 2021-10-08
    • 1970-01-01
    • 2011-05-06
    相关资源
    最近更新 更多