相关疑难解决方法(0)

如何获取和设置图像的属性

我正在尝试理解Bitmap或Image的这两种方法.一个存在.SetPropertyItem(),另一个存在.GetPropertyItem().

我完全混淆了文档说我要设置属性项的方式.

Microsoft文档中,它声明我们应该通过图像中已存在的属性项的id选择属性项,为该属性项提供新ID,设置属性,然后使用该检索到的属性设置image属性项项目.

这太奇怪了,但真正让我感到的是我们不能只将属性项的id设置为我们必须将属性项id设置为属性项id列表中已存在的id的任何ID.

令人困惑的是,我正在使用已经通过其他方式设置的属性并覆盖它的属性,然后使用属性id列表中的其他现有ID将其添加回图像.

我在这里错过了什么?有没有办法简单地创建一个新的PropertyItem,然后将具有任何给定ID的属性项添加到图像或位图?

这是我正在谈论的一个例子.20752的ID是图像已有的属性,当我设置PropertyItem的ID时,20753是Image所具有的ID.

这将成功设置属性项.

  private void Form1_Load(object sender, EventArgs e)
    {

        string path = Environment.CurrentDirectory + @"\sample.png";
        Image image = Image.FromFile(path);

        PropertyItem pi = image.GetPropertyItem(20752);

        pi.Id = 20753;

        pi.Type = 1;
        pi.Value = Encoding.UTF8.GetBytes("MyImageInfo");
        pi.Len = pi.Value.Length;
        image.SetPropertyItem(pi);

        image.Save(Environment.CurrentDirectory + @"\sample2.png");
    }
Run Code Online (Sandbox Code Playgroud)

这将成功检索PropertyItem.

  private void Form1_Load(object sender, EventArgs e)
        {

            string path = Environment.CurrentDirectory + @"\sample.png";
            Image image = Image.FromFile(path);

            PropertyItem propItem = image.GetPropertyItem(20753);
        }
Run Code Online (Sandbox Code Playgroud)

有一种方法,我可以用自己的ID创建一个新的PropertyItem,而不必做所有那些奇怪的东西?或者我在这里遗漏了什么?

或者,是为图像或位图设置其他类型属性的更好方法吗?我正在寻找一种基本的方法来保存信息并在以后检索它.

我在这做错了什么?

c# graphics image bitmap graph-drawing

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

将元数据写入jpg和png

我需要为上传的图像添加元数据标签(描述).

我找到了这个答案:https://stackoverflow.com/a/1764913/6776适用于JPG文件,但不适用于PNG.

private string Tag = "test meta data";

private static Stream TagImage(Stream input, string type)
{
    bool isJpg = type.EndsWith("jpg", StringComparison.InvariantCultureIgnoreCase) || type.EndsWith("jpeg", StringComparison.InvariantCultureIgnoreCase);
    bool isPng = type.EndsWith("png", StringComparison.InvariantCultureIgnoreCase);

    BitmapDecoder decoder = null;

    if (isJpg)
    {
        decoder = new JpegBitmapDecoder(input, BitmapCreateOptions.PreservePixelFormat, BitmapCacheOption.OnLoad);
    }
    else if (isPng)
    {
        decoder = new PngBitmapDecoder(input, BitmapCreateOptions.PreservePixelFormat, BitmapCacheOption.OnLoad);
    }
    else
    {
        return input;
    }

    // modify the metadata
    BitmapFrame bitmapFrame = decoder.Frames[0];
    BitmapMetadata metaData = (BitmapMetadata)bitmapFrame.Metadata.Clone();
    metaData.Subject = Tag;
    metaData.Comment …
Run Code Online (Sandbox Code Playgroud)

c# image

6
推荐指数
1
解决办法
7361
查看次数

使用Image.Save和EncoderParameters无损旋转JPG图像失败

我必须旋转.net(90°| 180°| 270°)中无损的JPG图像。以下文章显示了如何执行此操作:

这些例子似乎很简单。但是,我没有运气去工作。我的源数据是一个数组(各种JPG文件,来自互联网的相机等),因此我想将旋转后的图像也作为字节数组返回。这里是(简化的)代码:

Image image;
using (var ms = new MemoryStream(originalImageData)) {
    image = System.Drawing.Image.FromStream(ms);
}

// If I don't copy the image into a new bitmap, every try to save the image fails with a general GDI+ exception. This seems to be another bug of GDI+.
var bmp = new Bitmap(image);    

// Creating the parameters for saving
var encParameters = new EncoderParameters(1);            
encParameters.Param[0] = new EncoderParameter(Encoder.Transformation, (long)EncoderValue.TransformRotate90);              
using (var ms = new MemoryStream()) {                
    // Now …
Run Code Online (Sandbox Code Playgroud)

.net c# jpeg system.drawing gdi+

6
推荐指数
1
解决办法
173
查看次数

标签 统计

c# ×3

image ×2

.net ×1

bitmap ×1

gdi+ ×1

graph-drawing ×1

graphics ×1

jpeg ×1

system.drawing ×1