标签: gdi

阅读JPEG元数据的问题(方向)

我有一张在iphone上拍摄的JPEG图像.在我的台式PC(Windows照片查看器,谷歌浏览器等)上,方向不正确.

我正在开发一个ASP.NET MVC 3 Web应用程序,我需要上传照片(目前正在使用plupload).

我有一些服务器端代码来处理图像,包括读取EXIF数据.

我已经尝试PropertyTagOrientation在EXIF元数据中读取字段(使用GDI - Image.PropertyItems),但该字段不存在.

所以它是一些特定的iphone元数据,或者其他一些元数据.

我使用了另一种工具,如Aurigma Photo Uploader,它正确读取元数据并旋转图像.它是如何做到的?

有没有人知道其他JPEG元数据可以包含所需的信息,以便知道它需要旋转,Aurigma使用的是什么?

这是我用来读取EXIF数据的代码:

var image = Image.FromStream(fileStream);

foreach (var prop in image.PropertyItems)
{
   if (prop.Id == 112 || prop.Id == 5029)
   {
      // do my rotate code - e.g "RotateFlip"
      // Never get's in here - can't find these properties.
   }
}
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?

c# jpeg metadata gdi image-processing

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

枚举计算机上的监视器

我找到了7种不同的方法来枚举连接到计算机的显示器.但是所有解决方案都会给出不同的结果(监视器的数量和每个监视器上的信息).

这些解决方案是:

  1. 使用着名的 EnumDisplayDevices

  2. 运用 EnumDisplayMonitors

  3. 使用Windows Management Instrumentation(WMI):
    使用以下查询:SELECT * FROM WmiMonitorIDroot\\WMI命名空间中.

  4. 再次使用WMI:
    使用新查询:SELECT * FROM Win32_DesktopMonitorroot\\CIMV2命名空间中.

  5. 使用Setup API:
    首先调用SetupDiGetClassDevs以检索设备信息集,然后迭代SetupDiEnumDeviceInfo

  6. 使用的DirectX图形基础结构(DXGI)
    随着第一IDXGIFactory::EnumAdapters,然后IDXGIAdapter::EnumOutput

  7. 使用连接和配置显示(CCD)API:
    QueryDisplayConfig(QDC_ALL_PATHS, &numPathArrayElements, pathInfoArray, &numModeInfoArrayElements, modeInfoArray, nullptr);

我试图准确理解所有这些方法与MSDN参考之间的区别,徒劳无功.

意见

从我观察到的:

  • WmiMonitorID安装程序API查询返回连接(不一定活性)显示器的列表.
  • Win32_DesktopMonitor WMI查询返回错误(至少意想不到的)结果(仅1个显示器枚举即使不活动时,和桌面另一台显示器上).
  • EnumDisplayDevices返回活动设备列表(除非只有1个监视器处于活动状态且其他监视器已连接)
  • EnumDisplayMonitorsDXGI查询返回活动监视器列表.
  • CCD似乎是最可靠的方法(在目标和源之间提供所有可能的路径).

问题

使用这些方法时(连接显示列表,已安装显示列表,活动显示列表),我真正期望得到什么结果?如果我使用镜像显示器或扩展显示器怎么办?如果计算机有多个没有多个输出的图形卡怎么办?

额外奖励:某些方法(DXGI …

c++ windows gdi dxgi

42
推荐指数
1
解决办法
9069
查看次数

如何获取TextRenderer使用的确切文本边距

System.Windows.Forms.TextRenderer.DrawText方法使用或不使用左右填充来呈现带格式的文本,具体取决于flags参数的值:

  • TextFormatFlags.NoPadding - 将文本紧密地放入边框中,
  • TextFormatFlags.GlyphOverhangPadding - 添加一些左右边距,
  • TextFormatFlags.LeftAndRightPadding - 增加更大的利润.

现在,我的问题是如何获得DrawText给定设备上下文,字符串,字体等文本添加的填充(左和右)的确切数量

我使用.NET Reflector挖掘.NET 4,发现TextRenderer计算"悬垂填充",它是字体高度的1/6,然后将此值乘以使用这些系数计算左右边距:

  • 左边1.0,右边1.5 TextFormatFlags.GlyphOverhangPadding,
  • 左2.0,右2.5 TextFormatFlags.LeftAndRightPadding.

生成的值将向上舍入并传递给DrawTextExADrawTextExW本机API函数.重新创建此过程很困难,因为字体的高度不是来自System.Drawing.Font而是来自,System.Windows.Forms.Internal.WindowsFont并且这些类为同一字体返回不同的值.并且System.Windows.Forms.Internal涉及命名空间中的许多其他内部BCL类.反编译所有这些并在我的应用程序中重用它们的代码不是一个选项,因为那将是一个严重的.NET实现依赖.这就是为什么我需要知道WinForms中是否有一些公共API,或者至少我可以使用哪些Windows函数来获取左右边距的值.


注意:我已尝试TextRenderer.MeasureText使用和不使用填充并比较结果,但这只给了我左右边距的总和,我需要它们分开.


注意2:如果你想知道我为什么需要这个:我想绘制一个包含多种字体/颜色的字符串.这涉及DrawText为每个带有NoPadding选项的统一格式化子字符串调用一次(以便文本不会传播)但我还想GlyphOverhangPadding在整个多格式文本的开头和结尾处手动添加正常.

c# gdi winforms

29
推荐指数
2
解决办法
5390
查看次数

如何使用"工具提示"捕获屏幕?

我正在使用GDI捕获屏幕,我注意到屏幕截图中没有包含"工具提示".这是我的基本代码:

HDC hdcDesk = GetDC(0);

HDC hdcMem = CreateCompatibleDC(hdcDesk);
HBITMAP hbmMem = CreateCompatibleBitmap(hdcDesk, 1920, 1080);
SelectObject(hdcMem, hbmMem);

StretchBlt(hdcMem, 0, 0, 1920, 1080, hdcDesk, 0, 0, 1920, 1080, SRCCOPY);

// Now save the bitmap...
Run Code Online (Sandbox Code Playgroud)

可以修复,还是应该使用其他方法捕获屏幕(GDI除外)?


编辑:

这是我拍摄的不显示工具提示的屏幕截图.

在此输入图像描述

c c++ winapi gdi

28
推荐指数
2
解决办法
1341
查看次数

WinApi中的GetClientRect和GetWindowRect有什么区别?

我应该在InvalidateRect中使用以下内容来刷新我的窗口?为什么?

c++ windows winapi gdi

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

在卷纸上打印

我正在使用C#和Winforms.我正试图在纸卷上打印钞票.纸张的宽度为3英寸,但纸张的长度是动态的(它是卷纸).长度取决于列表中有多少项.例如,在购买时如果有100件商品售出那么它将是相当长的卷,而对于购买的单件商品它将是很小的长度.

当我打印报告时,在结束作业之后,打印机会弹出最后一页而不是我需要的页面.只要A4尺寸就可以弹出纸张.我想打印所需的行,然后停止打印.我使用的是一卷纸,而不是A4或A3和Epson LQ-300 + II打印机.

更具体地说,始终对页面大小的单元进行打印.如果我将页面设置为3英寸x 8英寸,那么我总是打印出8英寸长的打印输出.如果我要打印一张9英寸的钞票,我最终会打印出16英寸的纸张,浪费7英寸的纸张.如何打印最后一页只需要它就可以了?

这是代码:

private void printDoc_PrintPage(Object sender, PrintPageEventArgs e)
        {
            Font printFont = new Font("Courier New", 12);
            int y = 15;
            e.Graphics.DrawString("a Line", printFont, Brushes.Black, 0, y); y = y + 20;
            e.Graphics.DrawString(" Line", printFont, Brushes.Black, 0, y); y = y + 25;
            e.Graphics.DrawString(" Line", printFont, Brushes.Black, 0, y); y = y + 35;
            e.Graphics.DrawString(" Line", printFont, Brushes.Black, 0, y); y = y + 45;
        }
Run Code Online (Sandbox Code Playgroud)

.net c# printing gdi crystal-reports

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

是否可以从Visual Studio调试器中检测GDI泄漏?

可以从任务管理器或Process Explorer中查看泄漏的GDI对象.(嗯,你没有看到泄漏,但你可以看到对象uasage数量是否持续上升.)

还有一些工具允许按类型查看GDI对象,例如GDIView [a],DeLeaker,DPUSGDIDebug(sourecode).

[a]请注意,我认为GDIView是一个很好的工具,可以完成识别和确认存在的GDI泄漏的工作,但它并没有真正帮助您在大型应用程序中找到泄漏的代码.(我还会在这里注意到这个工具工作得非常好,看起来表现得很好,虽然它的主页很奇怪( - :)

还有一个名为leaktrap的WinDBG插件,它使用MSs Detours Library.

我也知道(并且已经使用过)AQTime的资源分析器,它允许检测应用程序中的GDI(和其他)资源泄漏,包括泄漏调用的堆栈跟踪.

现在,我的实际问题是:是否可以从VC++调试器中检测泄漏的GDI对象?因此,不需要单独的工具,并且在正常调试期间可以捕获GDI泄漏,而不必单独检查.

c++ debugging gdi visual-studio visual-c++

23
推荐指数
1
解决办法
5521
查看次数

TDirect2DCanvas是慢还是我做错了什么?

在寻找替代GDI的替代方案时,我试图在Windows 7中测试Delphi的2010 TDirect2DCanvas性能.

我通过使用Direct2D绘制一条巨大的折线来测试它,结果非常慢,即使数据量少于我使用GDI进行相同测试的数量少500倍(我甚至没有在GDI中使用位图作为后备缓冲,我只是直接绘制到表单画布).

所以我想:
a) Direct2D比GDI慢;
b) TDirect2DCanvas很慢;
c)我做错了什么
,希望它是c).

我写的测试代码是:

unit Unit2;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls, Direct2D, D2D1;

type
  TForm2 = class(TForm)
  private
    { Private declarations }
    FD2DCanvas: TDirect2DCanvas;
    FData: array[0..50000] of TPoint;
  public
    procedure CreateWnd; override;
    procedure WMSize(var Message: TWMSize); message WM_SIZE;
    procedure WMPaint(var Message: TWMPaint); message WM_PAINT;


    { Public declarations }
  end;

var
  Form2: TForm2;

implementation

uses utils;

{$R *.dfm}

procedure TForm2.CreateWnd;
var
  i: Integer; …
Run Code Online (Sandbox Code Playgroud)

delphi gdi direct2d delphi-2010 delphi-xe

22
推荐指数
1
解决办法
8428
查看次数

如何使用Win32/GDI加载PNG图像(如果可能,没有GDI +)?

是否可以使用Win32 GDI函数将PNG从文件加载到HBITMAP中?如果没有,没有使用外部库(如libpng),最轻的解决方案是什么?

c++ winapi png gdi image

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

GDI,GDI +和OpenGL真的已经过时/弃用了吗?

如果您在microsoft.com上打开"图形和游戏(Windows)"页面

最后一类被描述为

旧版图形:已过时且不应在新应用程序中使用的技术.

此类别包括(以及其他)以下API:

  • GDI
  • GDI +
  • OpenGL的

你怎么看?如果我想今天推出一款新软件,它必须支持Windows XP(仍然约占所有已安装系统的50%).Direct2D需要Windows 7/Vista.还应该使用什么?

opengl graphics winapi gdi+ gdi

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