jpeg是图形有损压缩的,你即使压缩率为100只要有别的类型图片转过来的基本都进行了转换,在转化的过程中使图片的像素降低了。

解决方案 »

  1.   

    jpeg是图形有损压缩的,你即使压缩率为100只要有别的类型图片转过来的基本都进行了转换,在转化的过程中使图片的像素降低了。
      

  2.   

    为什么用ACDSEE看就没损失呢?用Delphi编程打开Jpeg打开怎么样才能避免损失呢?
     我还是相信Delphi和各位高手能帮我。
     多谢。
      

  3.   

    Delphi和ACDSee支持的颜色不同,
    可以考虑用别的控件打开。
      

  4.   

    这是VC里得到的答复,有哪位能将它变成Object Pascal.Thank you.
    =========================================
    void JpegToForm(LPCTSTR szFile, HDC hdc)
    {
        // open file
        HANDLE hFile = CreateFile(szFile, GENERIC_READ, 0, NULL, OPEN_EXISTING, 0, NULL);
        _ASSERTE(INVALID_HANDLE_VALUE != hFile);    // get file size
        DWORD dwFileSize = GetFileSize(hFile, NULL);
        _ASSERTE(-1 != dwFileSize);    LPVOID pvData = NULL;
        // alloc memory based on file size
        HGLOBAL hGlobal = GlobalAlloc(GMEM_MOVEABLE, dwFileSize);
        _ASSERTE(NULL != hGlobal);    pvData = GlobalLock(hGlobal);
        _ASSERTE(NULL != pvData);    DWORD dwBytesRead = 0;
        // read file and store in global memory
        BOOL bRead = ReadFile(hFile, pvData, dwFileSize, &dwBytesRead, NULL);
        _ASSERTE(FALSE != bRead);
        GlobalUnlock(hGlobal);
        CloseHandle(hFile);    LPSTREAM pstm = NULL;
        // create IStream* from global memory
        HRESULT hr = CreateStreamOnHGlobal(hGlobal, TRUE, &pstm);
        _ASSERTE(SUCCEEDED(hr) && pstm);    // Create IPicture from image file
        LPPICTURE gpPicture;    hr = ::OleLoadPicture(pstm, dwFileSize, FALSE, IID_IPicture, (LPVOID *)&gpPicture);
        _ASSERTE(SUCCEEDED(hr) && gpPicture);    
        pstm->Release();    OLE_HANDLE m_picHandle;
        /*
        long hmWidth, hmHeight;
        gpPicture->get_Width(&hmWidth);
        gpPicture->get_Height(&hmHeight);
        int nWidth    = MulDiv(hmWidth, GetDeviceCaps(hdc, LOGPIXELSX), HIMETRIC_INCH);
        int nHeight    = MulDiv(hmHeight, GetDeviceCaps(hdc, LOGPIXELSY), HIMETRIC_INCH);
        */
        gpPicture->get_Handle(&m_picHandle);
        
        // 下面是我修改的代码
        // 取得图片大小
        POINT size;
        BITMAP bm;
        GetObject((HGDIOBJ) m_picHandle, sizeof(bm), &bm);
        size.x = bm.bmWidth; //nWidth;
        size.y = bm.bmHeight; //nHeight;    // 贴图
        HDC hMemDC = CreateCompatibleDC(hdc);
        HBITMAP hOldBmp = (HBITMAP)SelectObject(hMemDC, (HGDIOBJ)m_picHandle);
        BitBlt(hdc, 0, 0, size.x, size.y, hMemDC, 0, 0, SRCCOPY);
        SelectObject(hMemDC, hOldBmp);