我有一张在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)
有任何想法吗?
我找到了7种不同的方法来枚举连接到计算机的显示器.但是所有解决方案都会给出不同的结果(监视器的数量和每个监视器上的信息).
这些解决方案是:
使用着名的 EnumDisplayDevices
使用Windows Management Instrumentation(WMI):
使用以下查询:SELECT * FROM WmiMonitorID
在root\\WMI
命名空间中.
再次使用WMI:
使用新查询:SELECT * FROM Win32_DesktopMonitor
在root\\CIMV2
命名空间中.
使用Setup API:
首先调用SetupDiGetClassDevs
以检索设备信息集,然后迭代SetupDiEnumDeviceInfo
使用的DirectX图形基础结构(DXGI)
随着第一IDXGIFactory::EnumAdapters
,然后IDXGIAdapter::EnumOutput
使用连接和配置显示(CCD)API:
QueryDisplayConfig
(QDC_ALL_PATHS, &numPathArrayElements, pathInfoArray, &numModeInfoArrayElements, modeInfoArray, nullptr);
我试图准确理解所有这些方法与MSDN参考之间的区别,徒劳无功.
从我观察到的:
使用这些方法时(连接显示列表,已安装显示列表,活动显示列表),我真正期望得到什么结果?如果我使用镜像显示器或扩展显示器怎么办?如果计算机有多个没有多个输出的图形卡怎么办?
额外奖励:某些方法(DXGI …
System.Windows.Forms.TextRenderer.DrawText
方法使用或不使用左右填充来呈现带格式的文本,具体取决于flags
参数的值:
TextFormatFlags.NoPadding
- 将文本紧密地放入边框中,TextFormatFlags.GlyphOverhangPadding
- 添加一些左右边距,TextFormatFlags.LeftAndRightPadding
- 增加更大的利润.现在,我的问题是如何获得DrawText
给定设备上下文,字符串,字体等文本添加的填充(左和右)的确切数量?
我使用.NET Reflector挖掘.NET 4,发现TextRenderer计算"悬垂填充",它是字体高度的1/6,然后将此值乘以使用这些系数计算左右边距:
TextFormatFlags.GlyphOverhangPadding
,TextFormatFlags.LeftAndRightPadding
.生成的值将向上舍入并传递给DrawTextExA
或DrawTextExW
本机API函数.重新创建此过程很困难,因为字体的高度不是来自System.Drawing.Font
而是来自,System.Windows.Forms.Internal.WindowsFont
并且这些类为同一字体返回不同的值.并且System.Windows.Forms.Internal
涉及命名空间中的许多其他内部BCL类.反编译所有这些并在我的应用程序中重用它们的代码不是一个选项,因为那将是一个严重的.NET实现依赖.这就是为什么我需要知道WinForms中是否有一些公共API,或者至少我可以使用哪些Windows函数来获取左右边距的值.
注意:我已尝试TextRenderer.MeasureText
使用和不使用填充并比较结果,但这只给了我左右边距的总和,我需要它们分开.
注意2:如果你想知道我为什么需要这个:我想绘制一个包含多种字体/颜色的字符串.这涉及DrawText
为每个带有NoPadding
选项的统一格式化子字符串调用一次(以便文本不会传播)但我还想GlyphOverhangPadding
在整个多格式文本的开头和结尾处手动添加正常.
我正在使用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除外)?
编辑:
这是我拍摄的不显示工具提示的屏幕截图.
我应该在InvalidateRect中使用以下内容来刷新我的窗口?为什么?
我正在使用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) 可以从任务管理器或Process Explorer中查看泄漏的GDI对象.(嗯,你没有看到泄漏,但你可以看到对象uasage数量是否持续上升.)
还有一些工具允许按类型查看GDI对象,例如GDIView [a],DeLeaker,DPUS或GDIDebug(sourecode).
[a]请注意,我认为GDIView是一个很好的工具,可以完成识别和确认存在的GDI泄漏的工作,但它并没有真正帮助您在大型应用程序中找到泄漏的代码.(我还会在这里注意到这个工具工作得非常好,看起来表现得很好,虽然它的主页很奇怪( - :)
还有一个名为leaktrap的WinDBG插件,它使用MSs Detours Library.
我也知道(并且已经使用过)AQTime的资源分析器,它允许检测应用程序中的GDI(和其他)资源泄漏,包括泄漏调用的堆栈跟踪.
现在,我的实际问题是:是否可以从VC++调试器中检测泄漏的GDI对象?因此,不需要单独的工具,并且在正常调试期间可以捕获GDI泄漏,而不必单独检查.
在寻找替代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) 是否可以使用Win32 GDI函数将PNG从文件加载到HBITMAP中?如果没有,没有使用外部库(如libpng),最轻的解决方案是什么?
如果您在microsoft.com上打开"图形和游戏(Windows)"页面
最后一类被描述为
旧版图形:已过时且不应在新应用程序中使用的技术.
此类别包括(以及其他)以下API:
你怎么看?如果我想今天推出一款新软件,它必须支持Windows XP(仍然约占所有已安装系统的50%).Direct2D需要Windows 7/Vista.还应该使用什么?