标签: system.drawing

从.NET中的System.Drawing优化PNG输出

我有一个例程,它读取图像,调整大小并将其定位在新背景上(全新的位图,只是设置了大小).

这一切都非常完美,但是现在我想减小它输出的PNG文件的大小- 如果我输出JPEG文件,我得到的是我期望的~4K左右的文件大小,但我的PNG文件大小超过30K .

我知道我永远不会使用PNG达到JPEG级别,但我认为我可以做得更好.

当我将输出的PNG加载到Fireworks中时,我注意到背景和调整大小的图像仍然是单独的图层.在Fireworks中展平PNG可将文件大小减少5到10K.

那么,首先有一种方法可以在输出上以编程方式展平PNG吗?

其次,还有什么人可以推荐减少PNG大小吗?

我正在使用PNG文件,因为我希望将背景保持为透明.

码:

private static void ResizeImage(String ImageInPath, int MaxWidth, int MaxHeight, String ImageOutPath, Boolean PadImage, Color MyColour)
{
    Bitmap MyImage = new Bitmap(ImageInPath);
    Bitmap MyResizedImage = null;

    int XPosition = 0;
    int YPosition = 0;
    float Ratio = MyImage.Width / (float)MyImage.Height;

    int MyImageHeight = MyImage.Height;
    int MyImageWidth = MyImage.Width;

    if (MyImage.Width > MyImage.Height)
    {
        if (MyImage.Width > MaxWidth)
            MyResizedImage = new Bitmap(MyImage, new Size(MaxWidth, (int)Math.Round(MaxWidth / …
Run Code Online (Sandbox Code Playgroud)

.net png system.drawing

4
推荐指数
1
解决办法
3453
查看次数

双面板缓冲

可以通过将"AllPaintingInWmPaint","UserPaint"和"DoubleBuffer"ControlStyles的值设置为"true"(this.SetStyle(ControlStyles.AllPaintingInWmPaint | ControlStyles.UserPaint | ControlStyles.DoubleBuffer, true))来完成对整个表单的双缓冲.

但是System.Windows.Forms.Panel不会发生这种情况,因为该类不允许我这样做.我找到了一个解决方案:http://bytes.com/topic/c-sharp/answers/267635-double-buffering-panel-control.我也试过这个:Winforms Double Buffering.它是滞后的,即使它用在一个小图纸上,我有一些我在表格中使用的自定义资源和其他东西,因为我不会把整个表格变成一张图纸.第二个似乎会引起问题.还有其他方法吗?

我问这个是因为我不希望在调整表单大小时,面板上的绘图一直闪烁.如果有办法在没有双缓冲的情况下摆脱闪烁,我会很高兴知道.

c# system.drawing panel winforms double-buffering

4
推荐指数
1
解决办法
1万
查看次数

如何将我的表格中的面板保存为图片?

我有一个有2个面板的表格.我正在尝试将Panel2的内容保存为图像.我看到一个讨论使用屏幕截图的线程来执行此操作,但我再也找不到该线程了.另请阅读使用DrawToBitMap方法,但它来自visual studio 2005信息,不确定它是否是最新或最合适的解决方案.那么你建议将我的Panel2保存为图片,最好是jpg?

更新:我为DrawToBitMap实现了下面推荐的代码,但它保存了我的panel2的一半(左半部分,如果这有所不同).因为它保存了我的panel2的一半,所以我将宽度调用乘以'2'以使其保存完整的表单.一种奇怪的东西,对我来说没有意义,因为面板2的宽度应该是整个面板而不是它的一半?

//multiplies the width of panel2 call by 2 to make it save the full panel
Bitmap bmp = new Bitmap(splitContainer1.Panel2.Width * 2, splitContainer1.Panel2.Height);
splitContainer1.Panel2.DrawToBitmap(bmp, splitContainer1.Panel2.Bounds);
bmp.Save(@"C:\Test.bmp");
Run Code Online (Sandbox Code Playgroud)

c# system.drawing image panel

4
推荐指数
1
解决办法
1万
查看次数

C# - Base64字节数组到Image FAILS无论我尝试什么

我在从base64编码的字节数组中用C#创建一个Image/Bitmap对象时遇到了麻烦.

这是我正在处理的事情:


我有一个前端,用户可以裁剪图像.当用户通过a选择图像时input[type=file],我的javascript代码使用HTML5的FileReader将DataUrl(base64字符串)保存到a hidden field,与作物坐标和尺寸以及其中的所有其他内容一起发布form.

精华:

base64数据,如果你想测试自己:

http://kristianbak.com/test_image.txt

  1. base64字符串发布到操作,并作为参数接收 imageData
  2. 该操作将字符串转换为base64字节数组,如下所示:
  3. byte[] imageBytes = Convert.FromBase64String(imageData.EncodeTo64());

EncodeTo64扩展方法:

public static string EncodeTo64(this String toEncode)
{
    var toEncodeAsBytes = Encoding.ASCII.GetBytes(toEncode);
    var returnValue = Convert.ToBase64String(toEncodeAsBytes);
    return returnValue;
}
Run Code Online (Sandbox Code Playgroud)

将base64字符串转换为字节数组后,我使用以下命令将字节读入内存MemoryStream:

using (var imageStream = new MemoryStream(imageBytes, false))
{
    Image image = Image.FromStream(imageStream); //ArgumentException: Parameter is not valid.
}
Run Code Online (Sandbox Code Playgroud)

我也尝试了以下变化:

一个)

using (var imageStream = new MemoryStream(imageBytes))
{
    Bitmap image = new Bitmap(imageStream); //ArgumentException: Parameter is not …
Run Code Online (Sandbox Code Playgroud)

c# system.drawing image bitmap

4
推荐指数
1
解决办法
7916
查看次数

当位图是一定大小时,Bitmap.LockBits错误"参数无效"?

我创建了一个方法,我想采取图像蒙版并将其应用于另一个图像.如果你看一下这篇文章,你会看到一个帧图像.该帖子中的帧图像是maskingImage,背景图像是imageToMask.遮蔽图像实际上是一个粉红色中心的图像.这是该方法经历的过程:

  1. 掩蔽图像是PNG,掩模图像是JPG.
  2. 该方法跟踪掩蔽图像并绘制图像以掩盖它.这有助于保持外部透明度不变.
  3. 然后在掩蔽图像下面绘制输出形式,我们使粉红色的颜色透明.

这条线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++) …
Run Code Online (Sandbox Code Playgroud)

.net c# system.drawing

4
推荐指数
1
解决办法
3433
查看次数

System.Drawing - 参数无效

经过一些更多的测试后,我发现这个问题可能是由于图像以某种方式没有被及时加载以克隆到位图并显示.这是可能的还是没有?

注意:是的,标题中有此错误还有其他问题,但从一些研究来看,它似乎是一个含糊不清的错误,有许多可能的原因.我没有发现与我相同的情况有任何问题.

我收到以下错误.

System.ArgumentException was unhandled
HResult=-2147024809
Message=Parameter is not valid.
Source=System.Drawing
Run Code Online (Sandbox Code Playgroud)

它来自这段代码.似乎是随机的(即,有时候它会起作用,有时却不起作用.连续运行的次数越多,没有重新启动VS并重建项目,失败的可能性越大):

private Bitmap GetSprite(bool anim, int tsIndex, int tileIdx) {
    System.Drawing.Rectangle cloneRect;
    string prefix = (anim) ? "A" : "S";
    using (Bitmap b = new Bitmap(prefix + tsIndex.ToString() + ".png")) {
        if (anim) {
            cloneRect = new System.Drawing.Rectangle(BaseObjects.A_AnimSpriteSets[tsIndex].StaticRecs[tileIdx].X, BaseObjects.A_AnimSpriteSets[tsIndex].StaticRecs[tileIdx].Y, BaseObjects.A_AnimSpriteSets[tsIndex].RecWidth, BaseObjects.A_AnimSpriteSets[tsIndex].RecHeight);
        } else {
            cloneRect = new System.Drawing.Rectangle(BaseObjects.A_StaticSpriteSets[tsIndex].StaticRecs[tileIdx].X, BaseObjects.A_StaticSpriteSets[tsIndex].StaticRecs[tileIdx].Y, BaseObjects.A_StaticSpriteSets[tsIndex].RecWidth, BaseObjects.A_StaticSpriteSets[tsIndex].RecHeight);
        }
        return b.Clone(cloneRect, b.PixelFormat);
    }
}
Run Code Online (Sandbox Code Playgroud)

具体来说,第四行:

using (Bitmap b = new Bitmap(prefix + tsIndex.ToString() + ".png")) …
Run Code Online (Sandbox Code Playgroud)

c# system.drawing bitmap .net-4.0

4
推荐指数
2
解决办法
3万
查看次数

如何在C#中从代码后面显示PictureBox

我知道我的问题听起来很基本,但我搜遍了整个地方,一无所获.这是我的代码:

public MainWindow()
{
    InitializeComponent();

    Map newMap = new Map();
    newMap.setMapStrategy(new SmallMapStrategy());
    newMap.createMap();


    System.Windows.Forms.PictureBox pictureBox1 = new System.Windows.Forms.PictureBox();
    pictureBox1.Paint += new System.Windows.Forms.PaintEventHandler(newMap.grid[3].afficher);

}
Run Code Online (Sandbox Code Playgroud)

这是一个功能:

public override void afficher(object sender, PaintEventArgs e)
{
    e.Graphics.DrawImage(squareImage, pos_x, pos_y, 50, 50);
}
Run Code Online (Sandbox Code Playgroud)

squareImage是与Drawing.Image对应的属性.pos_x和pos_y是自定义int32属性.

我想要的是在运行我的应用程序时看到图像...

c# wpf system.drawing picturebox drawimage

4
推荐指数
1
解决办法
2万
查看次数

DrawImage缩放原始图像

我使用一起竖直地缝合多个图像和水平方向以创建一个更大的图像(其中总宽度和高度的各个图像的宽度和高度的总和)BitmapSystem.Drawing.Graphics在C#.各个图像的大小为256像素×256像素.

当我使用DrawImageSystem.Drawing.Graphics,为什么我会得到原始图像的缩放和/或放大版本?


这是原始图像:

原始图像


当我以编程方式检索图像并在代码中写入文件时,我得到以下内容:

var result = httpClient.GetStreamAsync(/* url */);
var bitmap = new Bitmap(await result);
...
using (var memory = new MemoryStream())
{ 
   using (var fs = new FileStream(/* path */, FileMode.OpenOrCreate, FileAccess.ReadWrite))
   {
        bitmap.Save(memory, ImageFormat.Png); // I save to .png if that makes a difference
        var bytes = memory.ToArray();
        await fs.WriteAsync(bytes, 0, bytes.Length);
   }
}
Run Code Online (Sandbox Code Playgroud)

代码中的图像编程检索

我没看见有分别.到现在为止还挺好.


但是,当我尝试水平缝合图像时,我得到以下结果:

注意:作为参考,上面的图像位于下面拼接图像的最右侧.

水平缝合图像

它看起来缩放,放大,并且绝对不像上面原始或以编程方式检索的单个图像.


这是我用来将图像拼接在一起的代码:

注意:如果byWidthtrue,我水平缝合图像.

private Bitmap MergeImages(IEnumerable<Bitmap> images, bool …
Run Code Online (Sandbox Code Playgroud)

c# system.drawing image-manipulation

4
推荐指数
1
解决办法
2466
查看次数

c#使用gdi32.dll和System.Drawing.Graphics绘图

所以我有一些代码在gdi32.dll的图片框顶部创建一个高亮效果,我想知道是否有更简单的方法来做到这一点System.Drawing.Graphics?基本上使用gdi32.dll,我必须在绘制后捕获屏幕截图,将其发布到我的图片框然后我能够绘制更多的东西并更改我使用的笔的颜色.如果我只是尝试更改笔的粗细和颜色并再次在屏幕上绘图,如果我改变了已经绘制的内容.

现在我有一个使用System.Drawing.Graphics和大量数学的版本FillPolygon但如果我画了一个我已经画过的区域,它只会使我画的区域更暗.只要你还没有使用鼠标遮住区域,它就不能用gdi32.dll进行justr阴影处理.有什么建议?

public partial class Form9 : Form
{
    private bool is_mouse_down { get; set; } // Will check if the mouse is down or not.

    private Color Pen_Color = new Color();

    private int Pen_Type { get; set; }

    private int Thickness { get; set; }

    private bool Start { get; set; }

    List<Point> Points = new List<Point>();

    public Form9()
    {
        InitializeComponent();

        pictureBox1.Dock = DockStyle.Fill;

        Pen_Color = Color.Blue;
        Pen_Type = 13; // Type = …
Run Code Online (Sandbox Code Playgroud)

c# system.drawing gdi graphic

4
推荐指数
1
解决办法
1208
查看次数

如何在.NET Core中查找字体和字符串指标?

我需要在.NET Core 2中测量字符串的宽度和高度(以像素为单位).

在.NET Framework中可以使用Graphics.MeasureString方法完成,但在.NET Core中,Graphics类不再存在.

我还试图找到一个Font或FontFamily类并提取字体大小,字体上升和喜欢下降,但我找不到任何或类似的东西.

使用当前的.NET Core版本,仍然在努力工作,可以测量字符串或获取字体指标吗?

c# string graphics system.drawing .net-core

4
推荐指数
1
解决办法
1991
查看次数