我试图调用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) 我正在寻找最快的方法来创建按比例缩小的位图,以尊重 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) 我对Windows Imaging Component(WIC)和GDI +之间的关系模糊不清.我在过去做过一些工作,表明,例如,WIC产生了视觉上优越的GIF编码,但我很惊讶我没有看到更多的人使用它进行图像处理而不是GDI +.我知道它没有GDI +的绘制操作,但对于编码/解码它似乎更优越.那么为什么我们不看迁移呢?
我在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 …
我一直在做一些研究,以找出为什么 Windows 7 本身不支持照片查看器中的动画 GIF 图像。
人们建议使用各种第三方软件(也不是内置的 windows 照片查看器)来解决这个缺点。但由于照片查看器使用 WIC(Windows 成像组件)来解码图像,因此该系统可用于添加对几乎任何格式的支持。我猜这意味着我可以制作一个替换 GIF 编解码器来替换内置的编解码器,但在此之前我需要知道一些事情。
所以,我要问的是,照片查看器不支持 gif 动画的原因是因为 WIC 仅支持静止图像吗?还是 WPV 不支持动画格式的编码,但 WIC 编解码器可以支持它们?如果是这些原因之一,我想我没有理由开始这个项目(为动画 GIF 创建 WIC 编解码器)。
...或者微软真的没有考虑自己添加支持吗?
PS:名为 FastPictureViewer 的程序支持照片查看器中的动画 gif,但您只能“查看动画 GIF 中的单个帧”。关于此平台 (WIC) 的局限性或 WPV 的局限性的线索?
我正在尝试使用 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
数据由另一个仅支持此标记的应用程序读取,因此不能选择使用其他“注释”字段。
有任何想法吗?
我有在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)
我能做错什么?
有没有人使用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文档告诉一些不同的东西,没有关于字符串的东西; 但至少那里有经度和纬度的"有效"数据.
错过了什么是错误或我的错?
我计时了一个使用多个StretchBlt和StretchDIBits调用的DDB绘图操作.
我发现,完成时间与目标窗口大小成比例地增加/减少.
使用900x600窗口需要大约5ms,但是对于1920x1080,它需要大约55ms(源图像是1280x640).
看来Stretch .. API不使用任何硬件加速功能.
创建源图像(实际上这是临时绘图画布)CreateDIBSection因为我需要为绘制的每个帧生成(拉伸和合并)位图的像素数据.
让我们假设,Windows GDI是没有希望的.那么有希望的替代方案是什么?
我考虑使用WIC方法的D3D,D2D(写入WIC位图并使用D2D绘制它然后从WIC位图读回像素数据).
我计划用WIC方法尝试D2D,因为我需要很快使用大量的文本绘图功能.
但似乎WIC并不那么有希望:WIC位图处理最有效的像素格式是什么?
我正在尝试使用Direct2D和WIC Bitmap制作一个简单的视频播放器.
它需要YUV像素格式帧数据的快速和CPU经济绘制(具有拉伸).
我已经用GDI测试了.我希望切换到Direct2D可以获得至少10倍的性能提升(较小的CPU开销).
我要做的基本上如下:
对于1,2步,我必须选择像素格式.
WIC Native Pixel格式
有一个MSDN页面推荐WICPixelFormat32bppPBGRA.
http://msdn.microsoft.com/en-us/library/windows/desktop/hh780393(v=vs.85).aspx
有什么区别WICPixelFormat32bppPBGRA和WICPixelFormat32bppBGRA?(前者有额外的P)
如果WICPixelFormat32bppPBGRA是要走的路,总是这样吗?无论硬件和/或配置?
实际上WIC位图处理最有效的像素格式是什么?