标签: wic

如何通过nil代替const记录?

我试图调用WIC(Windows Imaging Component)工厂方法CreateEncoder:

HRESULT CreateEncoder(
  [in]            REFGUID guidContainerFormat,
  [in, optional]  const GUID *pguidVendor,
  [out, retval]   IWICBitmapEncoder **ppIEncoder
);
Run Code Online (Sandbox Code Playgroud)

一般的想法是:

var
   encoder: IWICBitmapEncoder;

CreateEncoder(
      GUID_ContainerFormatIco,  //The GUID for the desired container format
      nil, //No preferred codec vendor
      {out}encoder);
Run Code Online (Sandbox Code Playgroud)

对于第二个参数,我想通过nil; 表示我没有编码器偏好

但是Delphi对WinCodec.pas的翻译是:

function CreateEncoder(const guidContainerFormat: TGuid; const pguidVendor: TGUID;
      out ppIEncoder: IWICBitmapEncoder): HRESULT; stdcall;          
Run Code Online (Sandbox Code Playgroud)

你会注意到第二个参数,即可 TGUID,被声明为const.

那我怎么把它传递给你呢?

我怎样才能通过需要记录的nil地方const

我尝试了天真的解决方案:

const
   NULL_GUID: TGUID = ();

factory.CreateEncoder(GUID_ContainerFormatIco, NULL_GUID, {out}encoder);
Run Code Online (Sandbox Code Playgroud)

虽然这不会失败,但它并没有真正遵循正确的规则.它传递的是非NULL地址,指向API不知道的GUID.

我尝试了天真的解决方案:

factory.CreateEncoder(GUID_ContainerFormatIco, …
Run Code Online (Sandbox Code Playgroud)

windows delphi wic

7
推荐指数
1
解决办法
201
查看次数

使用 WIC 快速创建符合 EXIF 方向标签的缩小位图

我正在寻找最快的方法来创建按比例缩小的位图,以尊重 EXIF 方向标签

参考:https : //weblogs.asp.net/bleroy/the-fastest-way-to-resize-images-from-asp-net-and-it-s-more-supported-ish

目前我使用以下代码创建一个尊重 EXIF 方向标签的位图

  static Bitmap FixImageOrientation(Bitmap srce)
        {
            const int ExifOrientationId = 0x112;
            // Read orientation tag
            if (!srce.PropertyIdList.Contains(ExifOrientationId)) return srce;
            var prop = srce.GetPropertyItem(ExifOrientationId);
            var orient = BitConverter.ToInt16(prop.Value, 0);
            // Force value to 1
            prop.Value = BitConverter.GetBytes((short)1);
            srce.SetPropertyItem(prop);

            // Rotate/flip image according to <orient>
            switch (orient)
            {
                case 1:
                    srce.RotateFlip(RotateFlipType.RotateNoneFlipNone);
                    return srce;


                case 2:
                    srce.RotateFlip(RotateFlipType.RotateNoneFlipX);
                    return srce;

                case 3:
                    srce.RotateFlip(RotateFlipType.Rotate180FlipNone);
                    return srce;

                case 4:
                    srce.RotateFlip(RotateFlipType.Rotate180FlipX);
                    return srce;

                case 5:
                    srce.RotateFlip(RotateFlipType.Rotate90FlipX);
                    return srce; …
Run Code Online (Sandbox Code Playgroud)

.net c# wpf system.drawing wic

7
推荐指数
1
解决办法
396
查看次数

WIC和GDI +之间的关系是什么?

我对Windows Imaging Component(WIC)和GDI +之间的关系模糊不清.我在过去做过一些工作,表明,例如,WIC产生了视觉上优越的GIF编码,但我很惊讶我没有看到更多的人使用它进行图像处理而不是GDI +.我知道它没有GDI +的绘制操作,但对于编码/解码它似乎更优越.那么为什么我们不看迁移呢?

graphics gdi+ image-processing wic

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

用PInvoked GDI和透明PNG替换GDI + DrawImage

我在C#中创建了一个图像服务,它采用了基础层图像(JPG),将一个更透明的PNG层(32位)分层,然后输出最终的JPG图像.我试图从这个函数中挤出最后一毫秒,我的代码是GDI +中DrawImage调用的瓶颈.托管代码在这里:

// Load base image and create graphics
Image image = LoadImage(renderSettings.RenderedImageDirectory + baseLayer);

Graphics graphics = Graphics.FromImage(image);              
graphics.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQuality;
graphics.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic; 
graphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
graphics.PixelOffsetMode = System.Drawing.Drawing2D.PixelOffsetMode.HighSpeed;

// Draw additional layers to final image
for (int i = 1; i < renderLayers.Count; i++) {
    // SLOW -- LoadImage just a utility method that returns an Image from disk or cache
    graphics.DrawImage(LoadImage(renderSettings.RenderedImageDirectory + renderLayers[i]), 0, 0, image.Width, image.Height);            
}

if (graphics != null) graphics.Dispose();
Run Code Online (Sandbox Code Playgroud)

现在,我读到了通过P/Invoke直接调用GDI获得的性能提升,并试图替换DrawImage调用.我创建了一个单元测试,试图复制加载JPG的相同功能,然后在其上层叠一个透明PNG.

参考:http …

gdi+ wic direct2d sharpdx

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

Windows 照片查看器中是否支持动画 GIF?

我一直在做一些研究,以找出为什么 Windows 7 本身不支持照片查看器中的动画 GIF 图像。

人们建议使用各种第三方软件(也不是内置的 windows 照片查看器)来解决这个缺点。但由于照片查看器使用 WIC(Windows 成像组件)来解码图像,因此该系统可用于添加对几乎任何格式的支持。我猜这意味着我可以制作一个替换 GIF 编解码器来替换内置的编解码器,但在此之前我需要知道一些事情。

所以,我要问的是,照片查看器不支持 gif 动画的原因是因为 WIC 仅支持静止图像吗?还是 WPV 不支持动画格式的编码,但 WIC 编解码器可以支持它们?如果是这些原因之一,我想我没有理由开始这个项目(为动画 GIF 创建 WIC 编解码器)。

...或者微软真的没有考虑自己添加支持吗?

PS:名为 FastPictureViewer 的程序支持照片查看器中的动画 gif,但您只能“查看动画 GIF 中的单个帧”。关于此平台 (WIC) 的局限性或 WPV 的局限性的线索?

windows animated-gif wic photoviewer

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

如何向图像添加 JPEG 注释 (COM)?

我正在尝试使用 WPF 向图像文件添加 JPEG 注释。尝试以下代码会抛出一个ArgumentOutOfRangeException. 设置其他属性没有问题。

    using (Stream read = File.OpenRead(@"my.jpeg"))
    {
        JpegBitmapDecoder decoder = new JpegBitmapDecoder(read, BitmapCreateOptions.None, BitmapCacheOption.None);

        var meta = decoder.Frames[0].Metadata.Clone() as BitmapMetadata;
        meta.SetQuery("/app1/ifd/exif:{uint=40092}", "xxx"); // works
        meta.SetQuery("/com/TextEntry", "xxx"); // does not work
    }
Run Code Online (Sandbox Code Playgroud)

要清楚:我必须设置 MSDN http://msdn.microsoft.com/en-us/library/windows/desktop/ee719904%28v=vs.85%29.aspx 中列出的 /com/TextEntry 字段#_jpeg_metadata

数据由另一个仅支持此标记的应用程序读取,因此不能选择使用其他“注释”字段。

有任何想法吗?

.net c# wpf jpeg wic

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

为什么在我的32位应用程序中使用WIC在Windows 7 32位中失败?

我有在Visual Studio Pro 2012 Update 2 中使用Windows Image Component的 Win32 C++示例应用程序.我为X86构建了此应用程序,并在Windows 7 X64 SP1和Windows 7 X86 SP1中进行了测试.它与第一个一起工作正常,并且在后面的"未注册类"时失败.

如果我使用VS2008构建相同的代码,它可以正常工作.

WIC实例在示例应用程序中创建,如下所示:

#include "wincodec.h"
...
case WM_CREATE:
{
IWICImagingFactory *m_pIWICFactory;  
HRESULT hr = S_OK;

CoInitialize(NULL);
// create WIC factory (m_pIWICFactory)
hr = CoCreateInstance(
    &CLSID_WICImagingFactory,
    NULL,
    CLSCTX_INPROC_SERVER,
    &IID_IWICImagingFactory, 
    &m_pIWICFactory);
if (!SUCCEEDED(hr))
    MessageBox(NULL, 
        L"CoCreateInstance(..IID_IWICImagingFactory..) failed!", 
        L"", MB_OK);
else
    MessageBox(NULL, 
        L"CoCreateInstance(..IID_IWICImagingFactory..) succeeded!", 
        L"", MB_OK);

CoUninitialize();
}
break;
...
Run Code Online (Sandbox Code Playgroud)

我能做错什么?

winapi wic visual-studio visual-c++ windows-7

3
推荐指数
1
解决办法
1978
查看次数

WIC/WPF:System.GPS.Longitude和System.GPS.Latitude总是返回NULL(通过BitmapMetadata)

有没有人使用BitmapMetadata内部使用WIC(Windows Imaging Component)的WPF类成功读取GPS数据?

我有一个图像,其中Windows(8.1)资源管理器和XnView等外部工具显示GPS坐标.

我尝试使用类BitmapMetadata通过Metadata类的属性提取这些数据BitmapFrame:

var md = (BitmapMetdata)extractedFrame.Metadata;
var altitude = md.GetQuery("System.GPS.Altitude");
var altitudeProxy = md.GetQuery("System.GPS.Altitude.Proxy");
var altitudeRef = md.GetQuery("System.GPS.AltitudeRef");
var longitude = md.GetQuery("System.GPS.Longitude");
var longitudeProxy = md.GetQuery("System.GPS.Longitude.Proxy");
var longitudeRef = md.GetQuery("System.GPS.LongitudeRef");
var latitude = md.GetQuery("System.GPS.Latitude");
var latitudeProxy = md.GetQuery("System.GPS.Latitude.Proxy");
var latitudeRef = md.GetQuery("System.GPS.LatitudeRef");
Run Code Online (Sandbox Code Playgroud)

的结果altitude(System.Double),altitudeRef(System.Byte),longitudeRef(System.String)和latitudeRef(System.String)都确定和检索合理的数据( "510.70", "0", "N", "E").

longitude并且latitude应该是System.Double的数组,但它们始终为NULL.

使用".Proxy"后缀的结果返回奇怪的String数据,我不知道如何解析它们以及它们是否是文化不变的:MSDN文档告诉一些不同的东西,没有关于字符串的东西; 但至少那里有经度和纬度的"有效"数据.

错过了什么是错误或我的错?

.net c# windows wpf wic

3
推荐指数
1
解决办法
1075
查看次数

Windows StretchBlt API性能

我计时了一个使用多个StretchBltStretchDIBits调用的DDB绘图操作.

我发现,完成时间与目标窗口大小成比例地增加/减少.
使用900x600窗口需要大约5ms,但是对于1920x1080,它需要大约55ms(源图像是1280x640).

看来Stretch .. API不使用任何硬件加速功能.

创建源图像(实际上这是临时绘图画布)CreateDIBSection因为我需要为绘制的每个帧生成(拉伸和合并)位图的像素数据.

让我们假设,Windows GDI是没有希望的.那么有希望的替代方案是什么?

我考虑使用WIC方法的D3D,D2D(写入WIC位图并使用D2D绘制它然后从WIC位图读回像素数据).
我计划用WIC方法尝试D2D,因为我需要很快使用大量的文本绘图功能.

但似乎WIC并不那么有希望:WIC位图处理最有效的像素格式是什么?

windows direct3d wic stretchdibits direct2d

3
推荐指数
1
解决办法
1500
查看次数

WIC位图处理最有效的像素格式是什么?

我正在尝试使用Direct2D和WIC Bitmap制作一个简单的视频播放器.
它需要YUV像素格式帧数据的快速和CPU经济绘制(具有拉伸).

我已经用GDI测试了.我希望切换到Direct2D可以获得至少10倍的性能提升(较小的CPU开销).

我要做的基本上如下:

  1. 创建一个空的WIC位图A(用于绘制画布)
  2. 使用YUV帧数据创建另一个WIC位图B(格式转换)
  3. 将位图B绘制到A上,然后将A绘制到D2D渲染目标

对于1,2步,我必须选择像素格式.
WIC Native Pixel格式

有一个MSDN页面推荐WICPixelFormat32bppPBGRA.
http://msdn.microsoft.com/en-us/library/windows/desktop/hh780393(v=vs.85).aspx

有什么区别WICPixelFormat32bppPBGRAWICPixelFormat32bppBGRA?(前者有额外的P)

如果WICPixelFormat32bppPBGRA是要走的路,总是这样吗?无论硬件和/或配置?

实际上WIC位图处理最有效的像素格式是什么?

windows wic direct2d

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