小编pco*_*rey的帖子

具有viewBox和宽度的SVG在IE中未正确缩放高度

我正在尝试使用viewBox属性构造内联SVG,但没有明确的宽度或高度属性.我正在使用CSS将SVG的宽度设置为100%.这应该让SVG缩放到它的包装容器,保持viewBox设置的宽高比.在Chrome和Firefox中,这非常有效!

这是我正在谈论的最小代码示例:http://codepen.io/pcorey/pen/amkGl

HTML:

<div>
  <svg viewBox="0 0 100 10">
    <text x="1" y="9">hello</text>
  </svg>
</div>
Run Code Online (Sandbox Code Playgroud)

CSS:

div {
  width: 400px;
}

svg {
  width: 100%;
  max-height: 100%;
  outline: 1px solid tomato;
}

text {
  font-size: 10px;
}
Run Code Online (Sandbox Code Playgroud)

viewBox是100x10.外部div设置为400px宽度.这意味着SVG的高度应该是(并且在Chrome/Firefox中)40px.但是,在IE 11中,宽度总是150px(即使div的宽度超过1500px ......)

有没有一种很好的方法来解决这个问题?为什么IE无法正确处理未知高度?我可以使用" 内在宽高比 "技巧,但这是超级丑陋,需要另一个DOM元素,并要求我每次包装器调整大小时重新计算padding-top.

有关我为什么要这样做的更多信息,我写了一篇关于它的快速博客文章:http://1pxsolidtomato.com/2014/10/08/quest-for-scalable-svg-text/

谢谢您的帮助!

html javascript css svg

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

如何将InputStream转换为DataHandler?

我正在研究一个java Web应用程序,其中文件将存储在数据库中.最初我们通过调用getBytes结果集来检索DB中已有的文件:

byte[] bytes = resultSet.getBytes(1);
...
Run Code Online (Sandbox Code Playgroud)

然后DataHandler使用明显的构造函数将此字节数组转换为a :

dataHandler=new DataHandler(bytes,"application/octet-stream");
Run Code Online (Sandbox Code Playgroud)

这很有用,直到我们开始尝试存储和检索更大的文件.将整个文件内容转储到一个字节数组中然后构建一个DataHandler只需要太多内存.

我的直接想法是在数据库中检索数据流,getBinaryStream并以某种方式将其InputStream转换DataHandler为内存有效的方式.不幸的是,似乎没有直接的方法将一个转换InputStream成一个DataHandler.另一个想法我一直在玩从读取数据块InputStream,并将其写入OutputStreamDataHandler.但是...... 当我打电话时,我无法找到一种方法来创建一个DataHandler返回非空的"空" ...OutputStreamgetOutputStream

有没有人这样做过?我很感激你能给我的任何帮助或者正确的方向.

java inputstream outputstream

23
推荐指数
3
解决办法
7万
查看次数

使用SeDebugPrivilege将WriteProcessMemory添加到SYSTEM进程.(C,Vista)

我有兴趣在我的Vista机器上将DLL注入到SYSTEM拥有的进程中.我正在使用VirtualAllocEx,WriteProcessMemory和CreateRemoteThread的传统方法.但是,因为这将在SYSTEM进程上运行,所以我在打开目标进程之前在注入进程上启用SeDebugPivilege.


int EnableDebugPriv(LPCTSTR name) {
    HANDLE hToken;
    LUID luid;
    TOKEN_PRIVILEGES tkp;

    if(!OpenProcessToken(GetCurrentProcess(),
                         /*TOKEN_ADJUST_PRIVILEGES|TOKEN_QUERY*/
                         TOKEN_ALL_ACCESS,
                         &hToken))
        return 0;

    if(!LookupPrivilegeValue(NULL,name,&luid))
        return 0;

    tkp.PrivilegeCount=1;
    tkp.Privileges[0].Luid=luid;
    tkp.Privileges[0].Attributes=SE_PRIVILEGE_ENABLED;

    if(!AdjustTokenPrivileges(hToken,false,&tkp,sizeof(tkp),NULL,NULL))
    {
        printf("!AdjustTokenPrivileges - %d\n",GetLastError());
        return 0;
    }
    if(GetLastError()==ERROR_NOT_ALL_ASSIGNED)
    {
        return 0;
    }

    CloseHandle(hToken);
    return 1;
}
Run Code Online (Sandbox Code Playgroud)

SE_DEBUG_NAME常数为名称传递.

启用S​​eDebugPrivilege之后,我将完成打开目标进程,查找LoadLibrary,分配空间,将DLL路径写入内存以及创建线程(检查所有返回值)的过程:


if(NULL==(p=OpenProcess(PROCESS_ALL_ACCESS,FALSE,(DWORD)pid)))
...
if(NULL==(loadLib=(LPVOID)GetProcAddress(GetModuleHandle("kernel32.dll"), 
                                         "LoadLibraryA")))
...
if(NULL==(dllBuff=(LPVOID)VirtualAllocEx(p,
                                         NULL,
                                         strlen(dllPath)+1,
                                         MEM_RESERVE|MEM_COMMIT,
                                         PAGE_READWRITE)))
...
if(NULL==WriteProcessMemory(p,
                            (LPVOID)dllBuff,
                            dllPath,
                            strlen(dllPath),
                            &written))
...
if(!CreateRemoteThread(p,
                       NULL,
                       NULL,
                       (LPTHREAD_START_ROUTINE)loadLib,
                       (LPVOID)dllBuff,
                       NULL,
                       NULL))
...
Run Code Online (Sandbox Code Playgroud)

dllPath是DLL路径的char*(显然),pid是目标进程的PID.这两个值都通过命令行获取并在使用前进行验证.

我遇到的问题是,在CreateRemoteThread返回8("存储空间不足")之前,没有任何东西会返回错误.但是,WriteProcessMemory不会向进程写入任何字节.在调用之后,写入的变量始终为0.没有写入字节,但函数没有失败.我不确定为什么会这样.我查看了其他权限,比如SeRestorePrivilege,它承诺对所有进程进行写访问,但没有任何效果.

我正在使用管理员权限执行此程序.

注意:只有当我针对更高权限的用户(SYSTEM,LOCAL SERVICE等)运行此程序时,才会发生此WriteProcessMemory和CreateRemoteThread问题.它完全适用于我拥有的程序(相同的权限).

编辑:这是整个来源的链接.http://pastebin.com/m77110d8e除了基本的错误检查之外没有其他的东西,但也许它会有帮助吗?

c++ windows dll winapi windows-vista

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

是否可以更准确地测量SVG文本高度?

我正在尝试使用带有SVG文本标记的给定字体来测量用于呈现给定字符串的确切高度.

我已经尝试过使用getBBox和getExtentOfChar,但这两者返回的高度包括在实际渲染文本之上(有时在下方)的一些额外空间.

http://upload.wikimedia.org/wikipedia/commons/3/39/Typography_Line_Terms.svg 使用此图片中的术语,我试图获得正在渲染的文本的上限高度+下降高度.或者,如果那是不可能的,那就是帽子高度.有没有一种很好的方法来计算这些值?

这是一个快速的代码,显示我正在谈论的额外空间:http://codepen.io/pcorey/pen/amkGl

HTML:

<div>
  <svg><text>Hello</text></svg>
  <svg><text>Age</text></svg>
</div>
Run Code Online (Sandbox Code Playgroud)

JS:

$(function() {
  $('svg').each(function() {
    var svg = $(this);
    var text = svg.find('text');

    var bbox = text.get(0).getBBox();
    svg.get(0).setAttribute('viewBox',
                           [bbox.x,
                            bbox.y,
                            bbox.width,
                            bbox.height].join(' '));
  });
});
Run Code Online (Sandbox Code Playgroud)

我知道这是一个相当字体的东西,所以这可能是完全不可能的......

javascript css svg

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

标签 统计

css ×2

javascript ×2

svg ×2

c++ ×1

dll ×1

html ×1

inputstream ×1

java ×1

outputstream ×1

winapi ×1

windows ×1

windows-vista ×1