蘇泊爾耗的JPEG解碼器[一]

來源:互聯網
上載者:User

長夜漫漫,偶才整出這玩意兒-___-b想想大學時BBS上有個牛人花了一個月弄出MPEG來, 偶連做個jpeg都花了這麼長時間。聊以自慰的是還算是啃得比較透了。

原定的要求是:

1.要純C,不帶彙編和C++,便於移植;(話說回來,真要讓偶用彙編最佳化也不是那麼容易的事)

2.要支援漸近模式;(雲風兄的文檔上沒有介紹漸近模式,但偶發現實際應用中還是挺多的,比如偶D盤上某個隱藏目錄下面就有N多這樣的圖-___-|||)

3.不使用浮點運算;(想象ing:在51單片機上,在小X王986的6502晶片上,在電飯煲的面板上…無處不顯露著superarhow's jpeg的LOGO~~~~~ 流口水ing....)

4.要方便。目前的使用起來就一句話:HBITMAP jpeg_load_from_file(LPCTSTR filename)就OK。當然,自己處理的API還是有的。

目前還沒有實現的功能,或者說是遺憾有:

1.不支援DNL動態大小(雖然在代碼裡面有留,但是沒有實際的圖實在是難測試)

2.不支援CMYK格式(這種格式少,但也不是沒有,以前有做美術的兄弟就發給過偶這種圖,記得好像是用PS存的,可現在要找個PS好難)

3.不支援數學編碼(估計永遠都8會支援了-___-b)

工程不算大,就分篇貼出來了。有興趣的參考。

windows下的主控單元

jpegwin32.h

***************************************** 華麗滴分隔線(之1) ***************************************

/**************************************************************************************************

  superarhow's JPEG decoder

  by superarhow(superarhow@hotmail.com).  All rights reserved.

 **************************************************************************************************/

#pragma once

#include "windows.h"

#ifdef __cplusplus
extern "C" HBITMAP jpeg_load_from_file(LPCTSTR lpszFileName);
#else
HBITMAP jpeg_load_from_file(LPCTSTR lpszFileName);
#endif

***************************************** 華麗滴分隔線(之2) ***************************************

jpegwin32.c

***************************************** 華麗滴分隔線(之3) ***************************************

#include "jpegwin32.h"
#include "jpegdec2.h"
#include "windows.h"
#include "stdio.h"

HBITMAP jpeg_load_from_file(LPCTSTR lpszFileName)
{
 jpeg_dec_rec rec;
 FILE *fp;
 DWORD len;
 BYTE *buf;
 int ret;
 BITMAPINFO info;
 HBITMAP hbmp;

 fp = fopen(lpszFileName, "rb");
 fseek(fp, 0, SEEK_END);
 len = ftell(fp);
 fseek(fp, 0, SEEK_SET);
 buf = (BYTE *)malloc(len + 2);
 fread(buf, 1, len, fp);
 /* 加上EOI標記以增加容錯性 */
 buf[len] = 0xFF;
 buf[len + 1] = 0xD9;

 jpeg_init_decoder(&rec);
 rec.p_data = buf;
 rec.p_data_limit = buf + len;
 for ( ;; ) {
  ret = jpeg_decode_next_block(&rec);
  if (rec.p_data >= rec.p_data_limit) break; 
 }
 jpeg_clear_up(&rec);

 free(buf);

 if (rec.p_bgr_buffer) {
  memset(&info, 0, sizeof(BITMAPINFO));
  info.bmiHeader.biBitCount = 24;
  info.bmiHeader.biCompression = BI_RGB;
  info.bmiHeader.biHeight = -(int)rec.n_height;
  info.bmiHeader.biPlanes = 1;
  info.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
  info.bmiHeader.biWidth = rec.n_width;
  hbmp = CreateDIBSection( NULL, &info, DIB_RGB_COLORS, (void **)&buf, NULL, 0 );
  memcpy(buf, rec.p_bgr_buffer, rec.n_bytes_per_line * rec.n_height);
  return hbmp;
 }

 return NULL;
}

***************************************** 華麗滴分隔線(之4) ***************************************

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.