Отключите сглаживание для определенного контекста устройства GDI

Вы можете использовать разбиение по запросу, чтобы создать отдельный раздел в соответствии с field4, а затем взять сумму

SELECT
z.* FROM (SELECT
a.field1,
b.field2,
c.field3,
b.filed5,
a.field6,
SUM(d.field4) OVER (PARTITION BY a.field1, b.field2, c.field3, b.filed5, a.field6) AS field7,
ROW_NUMBER() OVER (PARTITION BY c.field4 ORDER BY c.field4) AS rank FROM a INNER JOIN b
ON a.field1 = b.field1 RIGHT JOIN c
ON b.field2 = c.field3 LEFT JOIN d
ON d.filed3 = a.field1 where some conditions; ) z WHERE z.rank = 1
.
9
задан Jacob Stanley 7 April 2009 в 12:14
поделиться

4 ответа

В соответствии с просьбой, я упаковал код, который написал для решения этой проблемы, и поместил его в репозиторий github: http://github.com/jystic/patch-iat

Похоже, много кода, потому что мне пришлось воспроизвести все структуры Win32, чтобы все это работало, и в то время я решил поместить каждую из них в отдельный файл.

Если вы хотите сразу перейти к сути кода, он находится в: ImportAddressTable.cs

Он очень свободно лицензируется и является общественным достоянием во всех смыслах и целях, поэтому не стесняйтесь использовать его в любой проект, который вам нравится.

3
ответ дан 4 December 2019 в 22:30
поделиться

действительно ли Класс GraphicsDevice является сторонним классом?

путем я сделал бы, это:

Graphics g = Graphics.FromImage(memImg);
g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.None;

или в Вашем случае:

GraphicsDevice graphics = GraphicsDevice.FromImage(bitmap)
graphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.None;

если Класс GraphicsDevice наследовался, Графический класс (иначе пытаются использовать Графический класс?)

0
ответ дан 4 December 2019 в 22:30
поделиться

К сожалению, Вы наклоняетесь. Способность управлять шрифтом анти-искажение сделана на шрифт. Вызов GDI CreateFontIndirect обрабатывает членов структуры LOGFONT, чтобы определить если его позволенный для использования cleartype, регулярного или никакое анти-искажение.

Существуют, как Вы отметили, настройки в масштабе всей системы. К сожалению, изменение настроек в масштабе всей системы является в значительной степени единственным (зарегистрированным) способом понизить качество рендеринга шрифта на DC, если Вы не можете управлять содержанием LOGFONT.


Этот код не является моим. Неуправляемый C. И сцепит любую функцию, импортированную dll или EXE-файлом, если Вы будете знать его HMODULE.

#define PtrFromRva( base, rva ) ( ( ( PBYTE ) base ) + rva )

/*++
  Routine Description:
    Replace the function pointer in a module's IAT.

  Parameters:
    Module              - Module to use IAT from.
    ImportedModuleName  - Name of imported DLL from which
                          function is imported.
    ImportedProcName    - Name of imported function.
    AlternateProc       - Function to be written to IAT.
    OldProc             - Original function.

  Return Value:
    S_OK on success.
    (any HRESULT) on failure.
--*/
HRESULT PatchIat(
  __in HMODULE Module,
  __in PSTR ImportedModuleName,
  __in PSTR ImportedProcName,
  __in PVOID AlternateProc,
  __out_opt PVOID *OldProc
  )
{
  PIMAGE_DOS_HEADER DosHeader = ( PIMAGE_DOS_HEADER ) Module;
  PIMAGE_NT_HEADERS NtHeader;
  PIMAGE_IMPORT_DESCRIPTOR ImportDescriptor;
  UINT Index;

  assert( Module );
  assert( ImportedModuleName );
  assert( ImportedProcName );
  assert( AlternateProc );

  NtHeader = ( PIMAGE_NT_HEADERS )
    PtrFromRva( DosHeader, DosHeader->e_lfanew );
  if( IMAGE_NT_SIGNATURE != NtHeader->Signature )
  {
    return HRESULT_FROM_WIN32( ERROR_BAD_EXE_FORMAT );
  }

  ImportDescriptor = ( PIMAGE_IMPORT_DESCRIPTOR )
    PtrFromRva( DosHeader,
      NtHeader->OptionalHeader.DataDirectory
        [ IMAGE_DIRECTORY_ENTRY_IMPORT ].VirtualAddress );

  //
  // Iterate over import descriptors/DLLs.
  //
  for ( Index = 0;
        ImportDescriptor[ Index ].Characteristics != 0;
        Index++ )
  {
    PSTR dllName = ( PSTR )
      PtrFromRva( DosHeader, ImportDescriptor[ Index ].Name );

    if ( 0 == _strcmpi( dllName, ImportedModuleName ) )
    {
      //
      // This the DLL we are after.
      //
      PIMAGE_THUNK_DATA Thunk;
      PIMAGE_THUNK_DATA OrigThunk;

      if ( ! ImportDescriptor[ Index ].FirstThunk ||
         ! ImportDescriptor[ Index ].OriginalFirstThunk )
      {
        return E_INVALIDARG;
      }

      Thunk = ( PIMAGE_THUNK_DATA )
        PtrFromRva( DosHeader,
          ImportDescriptor[ Index ].FirstThunk );
      OrigThunk = ( PIMAGE_THUNK_DATA )
        PtrFromRva( DosHeader,
          ImportDescriptor[ Index ].OriginalFirstThunk );

      for ( ; OrigThunk->u1.Function != NULL;
              OrigThunk++, Thunk++ )
      {
        if ( OrigThunk->u1.Ordinal & IMAGE_ORDINAL_FLAG )
        {
          //
          // Ordinal import - we can handle named imports
          // ony, so skip it.
          //
          continue;
        }

        PIMAGE_IMPORT_BY_NAME import = ( PIMAGE_IMPORT_BY_NAME )
          PtrFromRva( DosHeader, OrigThunk->u1.AddressOfData );

        if ( 0 == strcmp( ImportedProcName,
                              ( char* ) import->Name ) )
        {
          //
          // Proc found, patch it.
          //
          DWORD junk;
          MEMORY_BASIC_INFORMATION thunkMemInfo;

          //
          // Make page writable.
          //
          VirtualQuery(
            Thunk,
            &thunkMemInfo,
            sizeof( MEMORY_BASIC_INFORMATION ) );
          if ( ! VirtualProtect(
            thunkMemInfo.BaseAddress,
            thunkMemInfo.RegionSize,
            PAGE_EXECUTE_READWRITE,
            &thunkMemInfo.Protect ) )
          {
            return HRESULT_FROM_WIN32( GetLastError() );
          }

          //
          // Replace function pointers (non-atomically).
          //
          if ( OldProc )
          {
            *OldProc = ( PVOID ) ( DWORD_PTR )
                Thunk->u1.Function;
          }
#ifdef _WIN64
          Thunk->u1.Function = ( ULONGLONG ) ( DWORD_PTR )
              AlternateProc;
#else
          Thunk->u1.Function = ( DWORD ) ( DWORD_PTR )
              AlternateProc;
#endif
          //
          // Restore page protection.
          //
          if ( ! VirtualProtect(
            thunkMemInfo.BaseAddress,
            thunkMemInfo.RegionSize,
            thunkMemInfo.Protect,
            &junk ) )
          {
            return HRESULT_FROM_WIN32( GetLastError() );
          }

          return S_OK;
        }
      }

      //
      // Import not found.
      //
      return HRESULT_FROM_WIN32( ERROR_PROC_NOT_FOUND );
    }
  }

  //
  // DLL not found.
  //
  return HRESULT_FROM_WIN32( ERROR_MOD_NOT_FOUND );
}

Вы назвали бы это из своего кода путем выполнения чего-то как (я не проверил, что это всегда компилирует :P):

  1. Объявите тип указателя к funciton, который Вы хотите сцепить:

    typedef FARPROC (WINAPI* PFNCreateFontIndirect)(LOGFONT*);
    
  2. Реализуйте функцию рычага

    static PFNCreateFontIndirect OldCreateFontIndirect = NULL;
    
    WINAPI MyNewCreateFontIndirectCall(LOGFONT* plf)
    {
      // do stuff to plf (probably better to create a copy than tamper with passed in struct)
      // chain to old proc
      if(OldCreateFontIndirect)
        return OldCreateFontIndirect(plf);
    }
    
  3. Сцепите функцию когда-то во время инициализации

    HMODULE h = LoadLibrary(TEXT("OtherDll"));
    PatchIat(h, "USER32.DLL", "CreateFontIndirectW", MyNewCreateFontIndirectProc, (void**)&OldCreateFontIndirectProc);
    

Конечно, если модуль, который Вы сцепляете, существует на земле.NET свое очень неясное как туда, где CreateFontIndirect вызов собирается произойти из. mscoree.dll? Фактический модуль Вы звоните? Удача я предполагаю :P

5
ответ дан 4 December 2019 в 22:30
поделиться

Вам нужно больше цветов, чем черный цвет и белый цвет на Ваших шрифтах? В противном случае Вы могли заставить свой битовый массив возразить изображению на 1 бит на пиксель (Format1bppIndexed?).

Система не будет, вероятно, сглаживать рендеринг шрифта на изображениях на 1 бит/пкс.

0
ответ дан 4 December 2019 в 22:30
поделиться
Другие вопросы по тегам:

Похожие вопросы: