void DlgDataExt::UpdatePreview() { if (m_image){ CxImage tmp; tmp.Copy(*m_image,true,false,false); if (m_chk_preview.GetCheck()){ UpdateData(1); if (m_btn_graylevel.GetCheck()){ tmp.Threshold(m_thresh); } else { tmp.SelectionAddColor(tmp.RGBtoRGBQUAD(m_color)); tmp.SelectionSplit(&tmp); tmp.Negative(); } } tmp.IncreaseBpp(24); tmp.Resample(150,90,0); if (m_bitmap) DeleteObject(m_bitmap); m_bitmap = tmp.MakeBitmap(m_picture.GetDC()->m_hDC); m_picture.SetBitmap(m_bitmap); } }
void ModelOpened::ExportPNG(wxString val, wxString suffix) { if (val == wxEmptyString) return; wxFileName fn = fixMPQPath(val); if (fn.GetExt().Lower() != wxT("blp")) return; TextureID temptex = texturemanager.add(val); Texture &tex = *((Texture*)texturemanager.items[temptex]); if (tex.w == 0 || tex.h == 0) return; wxString temp; unsigned char *tempbuf = (unsigned char*)malloc(tex.w*tex.h*4); tex.getPixels(tempbuf, GL_BGRA_EXT); CxImage *newImage = new CxImage(0); newImage->AlphaCreate(); // Create the alpha layer newImage->IncreaseBpp(32); // set image to 32bit newImage->CreateFromArray(tempbuf, tex.w, tex.h, 32, (tex.w*4), true); if (bPathPreserved) { wxFileName::Mkdir(wxGetCwd()+SLASH+wxT("Export")+SLASH+fn.GetPath(), 0755, wxPATH_MKDIR_FULL); temp = wxGetCwd()+SLASH+wxT("Export")+SLASH+fn.GetPath()+SLASH+fn.GetName()+wxT(".")+suffix; } else { temp = wxGetCwd()+SLASH+wxT("Export")+SLASH+fn.GetName()+wxT(".")+suffix; } //wxLogMessage(wxT("Info: Exporting texture to %s..."), temp.c_str()); if (suffix == wxT("tga")) #ifndef _MINGW newImage->Save(temp.mb_str(), CXIMAGE_FORMAT_TGA); #else newImage->Save(temp.wc_str(), CXIMAGE_FORMAT_TGA); #endif else
HBITMAP FrameBitmap(HBITMAP hBmp, COLORREF clrInColor, COLORREF clrOutColor, UINT inLineWidth, UINT outLineWidth) { CxImage ximage; ximage.CreateFromHBITMAP(hBmp); ximage.IncreaseBpp(24); UINT totalWidth = inLineWidth + outLineWidth; if (totalWidth == 0) return ximage.MakeBitmap(); LONG newWidth = ximage.GetWidth() + totalWidth * 2; LONG newHeight = ximage.GetHeight() + totalWidth * 2; RGBQUAD expandClr; expandClr.rgbBlue = GetBValue(clrInColor); expandClr.rgbGreen = GetGValue(clrInColor); expandClr.rgbRed = GetRValue(clrInColor); expandClr.rgbReserved = 0; ximage.Expand(newWidth, newHeight, expandClr); ximage.DrawLine(1, (newWidth - 1), 1, 1, clrOutColor); ximage.DrawLine(1, 1, 1, (newHeight - 1), clrOutColor); ximage.DrawLine((newWidth - 1), (newWidth - 1), 1, (newHeight - 1), clrOutColor); ximage.DrawLine((newWidth - 1), 1, (newHeight - 1), (newHeight - 1), clrOutColor); return ximage.MakeBitmap(); }
__declspec(dllexport) bool LoadImage(const char *file, unsigned int maxwidth, unsigned int maxheight, ImageInfo *info) { if (!file || !info) return false; if (IsDir(file)) return false; // load the image DWORD dwImageType = GetImageType(file); CxImage *image = new CxImage(dwImageType); if (!image) return false; int actualwidth = maxwidth; int actualheight = maxheight; try { if (!image->Load(file, dwImageType, actualwidth, actualheight) || !image->IsValid()) { #if !defined(_LINUX) && !defined(__APPLE__) int nErr = GetLastError(); #else int nErr = errno; #endif printf("PICTURE::LoadImage: Unable to open image: %s Error:%s (%d)\n", file, image->GetLastError(),nErr); delete image; return false; } } catch (...) { printf("PICTURE::LoadImage: Unable to open image: %s\n", file); delete image; return false; } // ok, now resample the image down if necessary if (ResampleKeepAspect(*image, maxwidth, maxheight) < 0) { printf("PICTURE::LoadImage: Unable to resample picture: %s\n", file); delete image; return false; } // make sure our image is 24bit minimum image->IncreaseBpp(24); // fill in our struct info->width = image->GetWidth(); info->height = image->GetHeight(); info->originalwidth = actualwidth; info->originalheight = actualheight; memcpy(&info->exifInfo, image->GetExifInfo(), sizeof(EXIFINFO)); // create our texture info->context = image; info->texture = image->GetBits(); info->alpha = image->AlphaGetBits(); return (info->texture != NULL); };
bool SaveThumb(CxImage &image, const char *file, const char *thumb, int maxWidth, int maxHeight, bool bNeedToConvert = true, bool autoRotate = true) { // ok, now resample the image down if necessary int ret = ResampleKeepAspectArea(image, maxWidth * maxHeight); if (ret < 0) return false; if (ret) bNeedToConvert = true; // if we don't have a png but have a < 24 bit image, then convert to 24bits if ( image.GetNumColors()) { if (!image.IncreaseBpp(24) || !image.IsValid()) { printf("PICTURE::SaveThumb: Unable to convert to 24bpp: Error:%s\n", image.GetLastError()); return false; } bNeedToConvert = true; } if ( autoRotate && image.GetExifInfo()->Orientation > 1) { image.RotateExif(image.GetExifInfo()->Orientation); bNeedToConvert = true; } #ifndef _LINUX ::DeleteFile(thumb); #else unlink(thumb); #endif // only resave the image if we have to (quality of the JPG saver isn't too hot!) if (bNeedToConvert) { // May as well have decent quality thumbs image.SetJpegQuality(90); if (!image.Save(thumb, image.AlphaIsValid() ? CXIMAGE_FORMAT_PNG : CXIMAGE_FORMAT_JPG)) { printf("PICTURE::SaveThumb: Unable to save image: %s Error:%s\n", thumb, image.GetLastError()); ::DeleteFile(thumb); return false; } } else { // Don't need to convert the file - copy it instead if (!CopyFile(file, thumb)) { printf("PICTURE::SaveThumb: Unable to copy file %s\n", file); ::DeleteFile(thumb); return false; } } return true; }
HBITMAP MixBitmap(HBITMAP hDstMix, HBITMAP hSrcMix, LONG xOffset, LONG yOffset) { CxImage ximage; ximage.CreateFromHBITMAP(hDstMix); ximage.IncreaseBpp(24); CxImage ximageStatus; ximageStatus.CreateFromHBITMAP(hSrcMix); ximage.MixFrom(ximageStatus, xOffset, yOffset); return ximage.MakeBitmap(); }
__declspec(dllexport) bool LoadImageFromMemory(const BYTE *buffer, unsigned int size, const char *mime, unsigned int maxwidth, unsigned int maxheight, ImageInfo *info) { if (!buffer || !size || !mime || !info) return false; // load the image DWORD dwImageType = CXIMAGE_FORMAT_UNKNOWN; if (strlen(mime)) dwImageType = GetImageType(mime); if (dwImageType == CXIMAGE_FORMAT_UNKNOWN) dwImageType = DetectFileType(buffer, size); if (dwImageType == CXIMAGE_FORMAT_UNKNOWN) { printf("PICTURE::LoadImageFromMemory: Unable to determine image type."); return false; } CxImage *image = new CxImage(dwImageType); if (!image) return false; int actualwidth = maxwidth; int actualheight = maxheight; try { bool success = image->Decode((BYTE*)buffer, size, dwImageType, actualwidth, actualheight); if (!success && dwImageType != CXIMAGE_FORMAT_UNKNOWN) { // try to decode with unknown imagetype success = image->Decode((BYTE*)buffer, size, CXIMAGE_FORMAT_UNKNOWN); } if (!success || !image->IsValid()) { printf("PICTURE::LoadImageFromMemory: Unable to decode image. Error:%s\n", image->GetLastError()); delete image; return false; } } catch (...) { printf("PICTURE::LoadImageFromMemory: Unable to decode image."); delete image; return false; } // ok, now resample the image down if necessary if (ResampleKeepAspect(*image, maxwidth, maxheight) < 0) { printf("PICTURE::LoadImage: Unable to resample picture\n"); delete image; return false; } // make sure our image is 24bit minimum image->IncreaseBpp(24); // fill in our struct info->width = image->GetWidth(); info->height = image->GetHeight(); info->originalwidth = actualwidth; info->originalheight = actualheight; memcpy(&info->exifInfo, image->GetExifInfo(), sizeof(EXIFINFO)); // create our texture info->context = image; info->texture = image->GetBits(); info->alpha = image->AlphaGetBits(); return (info->texture != NULL); };