⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 wavwin.cpp

📁 wavlet compression on c++ only cods
💻 CPP
字号:
// Copyright (c) 1999 Stephen T. Welstead. All rights reserved.
// File WAVWIN.CPP  Wavelet image compression window

#define STRICT

#include <malloc.h>
#include <string.h>
#include <time.h>

#include "uwl.h"
#include "utofile.h"
#include "utm.h"
#include "wavrids.h"
#include "wavelet.h"
#include "wave_dlg.h"
#include "wavwin.h"

twavelet_window_manager *the_wavelet_window_manager;

LRESULT CALLBACK _export WaveletWndProc (HWND hwnd, UINT message,
     WPARAM wParam,LPARAM lParam)
     {
     return
       (LRESULT CALLBACK) (the_wavelet_window_manager->
		handle_message (hwnd, message, wParam, lParam)) ;
     }

twavelet_window_manager::twavelet_window_manager (HINSTANCE hInstance,
     tmdi_frame_window *parent, LPCSTR menu_name,
     LPCSTR class_name):
    tmdi_manager (hInstance,parent,(LRESULT CALLBACK)WaveletWndProc,
	0,menu_name,"Wavelet Window",class_name,"WAV_ICON"){ }

void twavelet_window_manager::set_global_ptr (void) {
    the_wavelet_window_manager = this;}

int twavelet_window_manager::respond_wm_create (HWND hwnd) {
    child_window_struct *child;
    char *file_name;
    hwndClient = GetParent (hwindow) ;
    hwndFrame  = GetParent (hwndClient) ;
    file_name = new char [MAX_IMG_FILENAME_LEN+1];
    file_name[0] = '\0';
    if (!get_file_name_dlg (hwndClient,"*.bmp",
      "Bitmap File",file_name,MAX_IMG_FILENAME_LEN,OPEN_DLG)) {
       SendMessage (GetParent (hwnd), WM_MDIDESTROY,(WPARAM) hwnd, 0L) ;
       return 1;
       }
    child = new child_window_struct;
    child->hwnd = hwnd;
    child->window = new twavelet_window(hwnd,this,file_name);
    add_child_window (hwnd,child);
    return 1;
    }

twavelet_window::twavelet_window(HWND hwnd,
     tmdi_manager *the_manager,LPSTR the_image_filename)
     : timg_window(hwnd,the_manager,the_image_filename)
{
   image_obj = new timage();
   wavelet_image = new timage ();
   delete display_image;
   display_image = image_obj;
   p_image_palette = 0;
   gray_image_available = 0;
   compression_percent = 10.0;
   transform_threshold_percent = 50.0;
   wavelet_type = 0;  // 0 = Haar wavelet; 1 = Daub4; 2 = Daub6
   scale_values = 0;
   set_wavelet_name(wavelet_type);
}

void twavelet_window::set_wavelet_name(int type) {
    switch (type) {
    case 1:
       strncpy (wavelet_name,"Daub4 Wavelet",WAV_NAME_LEN);
       break;
    case 2:
       strncpy (wavelet_name,"Daub6 Wavelet",WAV_NAME_LEN);
       break;
    default:
       strncpy (wavelet_name,"Haar Wavelet",WAV_NAME_LEN);
       }  // end switch
    wavelet_name[WAV_NAME_LEN] = '\0';
    return;
    }

int twavelet_window::respond_wm_create (HWND hwnd) {
    timg_window::respond_wm_create(hwnd);
    if (!read_BMP_file (hwindow,image_filename)) return 0;
    return 1;
    }

int twavelet_window::OnRun () {
    int rows = bmHeight,cols = bmWidth;
    if (wavelet_image->s.rows) {
       show_gray_image (wavelet_image);
       return 1;
       }
    if (!image_obj->s.rows) {
       if (!image_obj->allocate_image_struct
		 (rows,cols)) return 1;
       get_gray_image(image_obj);
       }
    show_gray_image(image_obj);
    return 1;
    }

int twavelet_window::get_compression_percent () {
    float value = compression_percent;
    int maxlen = 8,dec_places = 4,max_val = 100.0,min_val = 0.0;
    if (numeric_dialog (hwindow,
	"Compression Percent","Enter new compression percent",maxlen,
	dec_places,REAL_DATA,1,max_val,min_val,&value))
	compression_percent = value;
    return 1;
    }

int twavelet_window::get_transform_threshold () {
    float value = transform_threshold_percent;
    int maxlen = 6,dec_places = 2,max_val = 100.0,min_val = 0.0;
    if (numeric_dialog (hwindow,
	"Transform Threshold Percent","Enter new transform threshold %",maxlen,
	dec_places,REAL_DATA,1,max_val,min_val,&value))
	transform_threshold_percent = value;
    return 1;
    }

int twavelet_window::get_wavelet_type () {
    twave_dialog *wavelet_dlg = new twave_dialog (hwindow,wavelet_type);
    if (wavelet_dlg->exec_dialog())
       wavelet_type = wavelet_dlg->wavelet_choice;
    delete wavelet_dlg;
    set_wavelet_name(wavelet_type);
    return 1;
    }

int twavelet_window::get_wavelet_compressed_image ()
    {
    switch (wavelet_type) {
    case 1:
	 Daub4_wavelet = new tDaub4_wavelet();
	 wavelet_compression (Daub4_wavelet);
	 delete Daub4_wavelet;
	 break;
    case 2:
	 Daub6_wavelet = new tDaub6_wavelet();
	 wavelet_compression (Daub6_wavelet);
	 delete Daub6_wavelet;
	 break;
    default:
	 Haar_wavelet = new tHaar_wavelet();
	 wavelet_compression (Haar_wavelet);
	 delete Haar_wavelet;
	 }  //
    return 1;
    }

int twavelet_window::wavelet_compression (twavelet *wavelet) {
    float **values = 0;
    HCURSOR save_cursor,hour_glass_cursor;
    int rows = bmHeight,cols = bmWidth,i,j;
    time_t start_time,end_time,wavelet_transform_time,
	decimation_time,compression_time,inverse_transform_time,elapsed_time;
    float max,min,range;
    int int_value;

    if (!image_obj->s.rows) {
       if (!image_obj->allocate_image_struct
	       (rows,cols)) return 1;
       get_gray_image(image_obj);
       }
    if (wavelet_image->s.rows)
       wavelet_image->delete_image_struct ();
    if (!wavelet_image->allocate_image_struct
	   (rows,cols)) return 1;
    if (!(values = matrix2d (1,rows,1,cols))) return 1;
    hour_glass_cursor = LoadCursor(NULL,IDC_WAIT);
    save_cursor = SetCursor (hour_glass_cursor);
    int image_min = image_obj->s.pixel[1][1],
	image_max = image_obj->s.pixel[1][1],
	image_range;
    for (i=1;i<=rows;i++)
	for (j=1;j<=cols;j++) {
	     values[i][j] = image_obj->s.pixel[i][j];
	     if (image_min > image_obj->s.pixel[i][j])
		image_min = image_obj->s.pixel[i][j];
	     if (image_max < image_obj->s.pixel[i][j])
		image_max = image_obj->s.pixel[i][j];
		}
    image_range = image_max - image_min;
    message_printf (MB_INFO,"Compress",
      "Image Min: %d\r\nImage Max: %d\r\nImage Range: %d",
      image_min,image_max,image_range);
    twavelet_2d_array *wavelet_array = new twavelet_2d_array (values,
	wavelet,rows,cols);
    start_time = time(NULL);
    wavelet_array->transform();
    end_time = time(NULL);
    wavelet_transform_time = end_time - start_time;
    start_time = time(NULL);
    wavelet_array->decimate (compression_percent);
    end_time = time(NULL);
    decimation_time = end_time - start_time;
    compression_time = wavelet_transform_time + decimation_time;
    start_time = time(NULL);
    wavelet_array->inverse_transform();
    end_time = time(NULL);
    inverse_transform_time = end_time - start_time;
    elapsed_time = compression_time + inverse_transform_time;
    message_printf (MB_INFO,"Elapsed Time",
      "Wavelet Transform Time:   %ld\r\n"
      "Decimation Time:   %ld\r\n"
      "Total Compression Time:   %ld\r\n"
      "Inverse Transform Time:   %ld\r\n"
      "Total Elapsed Time: %ld\r\n",
      wavelet_transform_time,
      decimation_time,
      compression_time,
      inverse_transform_time,
      elapsed_time);

    min = wavelet_array->inverse_min;
    max = wavelet_array->inverse_max;
    range = max - min;
    if (range < 1) range = 1;
    message_printf (MB_INFO,"Compress",
      "Transform min: %7.4f\r\n"
      "Transform max: %7.4f\r\n"
      "Inverse min: %7.4f\r\n"
      "Inverse max: %7.4f",wavelet_array->transform_min,
         wavelet_array->transform_max,min,max);
    for (i=1;i<=rows;i++)
	for (j=1;j<=cols;j++) {
	    if (scale_values)
	    int_value =
		  (int) (((wavelet_array->values[i][j] - min)/range)
			     *image_range + image_min);
	    else
	    int_value =
		  (int) wavelet_array->values[i][j];  
	    if (int_value < 0) int_value = 0;
	    if (int_value > WAV_GRAY_LEVELS-1) int_value = WAV_GRAY_LEVELS-1;
	    wavelet_image->s.pixel[i][j] = (unsigned char)int_value;
	    }

    SetCursor (save_cursor);
    delete wavelet_array;
    free_matrix2d (values,1,rows,1);
    display_image = wavelet_image;
    show_gray_image(wavelet_image);

    sprintf ((char *)the_title,"%s (%5.2f%%): %s",wavelet_name,
	  compression_percent,(char *)image_filename);
    SetWindowText (hwindow,the_title);
    return 1;
    }

int twavelet_window::show_wavelet_transform ()
    {
    switch (wavelet_type) {
    case 1:
	 Daub4_wavelet = new tDaub4_wavelet();
	 wavelet_transform (Daub4_wavelet);
	 delete Daub4_wavelet;
	 break;
    case 2:
	 Daub6_wavelet = new tDaub6_wavelet();
	 wavelet_transform (Daub6_wavelet);
	 delete Daub6_wavelet;
	 break;
    default:
	 Haar_wavelet = new tHaar_wavelet();
	 wavelet_transform (Haar_wavelet);
	 delete Haar_wavelet;
	 }  //
    return 1;
    }

int twavelet_window::wavelet_transform (twavelet *wavelet) {
    float **values = 0,max,min,range;
    HCURSOR save_cursor,hour_glass_cursor;
    int rows = bmHeight,cols = bmWidth,i,j;

    if (!image_obj->s.rows) {
       if (!image_obj->allocate_image_struct
	       (rows,cols)) return 1;
       get_gray_image(image_obj);
       }
    if (wavelet_image->s.rows)
       wavelet_image->delete_image_struct ();
    if (!wavelet_image->allocate_image_struct
	   (rows,cols)) return 1;
    if (!(values = matrix2d (1,rows,1,cols))) return 1;
    hour_glass_cursor = LoadCursor(NULL,IDC_WAIT);
    save_cursor = SetCursor (hour_glass_cursor);
    for (i=1;i<=rows;i++)
	for (j=1;j<=cols;j++)
	     values[i][j] = image_obj->s.pixel[i][j];
    twavelet_2d_array *wavelet_array = new twavelet_2d_array (values,
	wavelet,rows,cols);
    wavelet_array->transform();
    wavelet_array->decimate(transform_threshold_percent);

    min = wavelet_array->transform_min;
    max = wavelet_array->transform_max;
    range = max - min;
    for (i=1;i<=rows;i++)
	for (j=1;j<=cols;j++)  {
	    if (wavelet_array->values[i][j] > 0.0)
		wavelet_image->s.pixel[i][j] = 0;  // BLACK
	    else
	    wavelet_image->s.pixel[i][j] = WAV_GRAY_LEVELS - 1;  // WHITE
	    }

    SetCursor (save_cursor);
    delete wavelet_array;
    free_matrix2d (values,1,rows,1);
    display_image = wavelet_image;
    show_gray_image(wavelet_image);

    sprintf ((char *)the_title,"%s Transform (%5.2f%%): %s",
	 (char *)wavelet_name,transform_threshold_percent,
	 (char *)image_filename);
    SetWindowText (hwindow,the_title);
    return 1;
    }

int twavelet_window::respond_wm_paint () {
   // Calls to Beginpaint and EndPaint required when handling
   // WM_PAINT message.
    if (!wavelet_image->s.rows)
       return timg_window::respond_wm_paint();
    PAINTSTRUCT     ps;
    HDC hdc = BeginPaint (hwindow,&ps);
    if (!hbitmap)
       message_puts (MB_EXCLAIM,"Wavelet","hbitmap is 0!");
    show_bitmap_image(hdc,hbitmap,p_image_palette);
    EndPaint (hwindow, &ps);
    return 1;
   }

int twavelet_window::respond_wm_command (WPARAM wParam,
    LPARAM) {
    switch (wParam)
       {
       case WAV_GRAY_IMAGE:
	    return OnRun();
       case WAV_WAVELET:
	    return get_wavelet_compressed_image();
       case WAV_SETUP:
	    return get_compression_percent();
       case WAV_THRESHOLD:
	    return get_transform_threshold();
       case WAV_TYPE:
	    return get_wavelet_type();
       case WAV_TRANSFORM:
	    return show_wavelet_transform();
       }  // end switch

    return timg_window::respond_wm_command (wParam,0L);
    }

int twavelet_window::respond_wm_destroy (HWND hwnd) {
    if (p_image_palette) free ((char *)p_image_palette);
    if (himage_bitmap) DeleteObject (himage_bitmap);
    delete [] image_filename;
    if (image_obj)
       delete image_obj;
    if (wavelet_image)
       delete wavelet_image;
    display_image = 0;
    timg_window::respond_wm_destroy (hwnd);
    return 1;
    }









⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -