📄 image.cpp
字号:
bool wxImage::SaveFile( const wxString& filename ) const
{
wxString ext = filename.AfterLast('.').Lower();
wxImageHandler * pHandler = FindHandler(ext, -1);
if (pHandler)
{
SaveFile(filename, pHandler->GetType());
return true;
}
wxLogError(_("Can't save image to file '%s': unknown extension."), filename.c_str());
return false;
}
bool wxImage::SaveFile( const wxString& filename, int type ) const
{
#if wxUSE_STREAMS
wxCHECK_MSG( Ok(), false, wxT("invalid image") );
((wxImage*)this)->SetOption(wxIMAGE_OPTION_FILENAME, filename);
wxFileOutputStream stream(filename);
if ( stream.IsOk() )
{
wxBufferedOutputStream bstream( stream );
return SaveFile(bstream, type);
}
#endif // wxUSE_STREAMS
return false;
}
bool wxImage::SaveFile( const wxString& filename, const wxString& mimetype ) const
{
#if wxUSE_STREAMS
wxCHECK_MSG( Ok(), false, wxT("invalid image") );
((wxImage*)this)->SetOption(wxIMAGE_OPTION_FILENAME, filename);
wxFileOutputStream stream(filename);
if ( stream.IsOk() )
{
wxBufferedOutputStream bstream( stream );
return SaveFile(bstream, mimetype);
}
#endif // wxUSE_STREAMS
return false;
}
bool wxImage::CanRead( const wxString &name )
{
#if wxUSE_STREAMS
wxFileInputStream stream(name);
return CanRead(stream);
#else
return false;
#endif
}
int wxImage::GetImageCount( const wxString &name, long type )
{
#if wxUSE_STREAMS
wxFileInputStream stream(name);
if (stream.Ok())
return GetImageCount(stream, type);
#endif
return 0;
}
#if wxUSE_STREAMS
bool wxImage::CanRead( wxInputStream &stream )
{
const wxList& list = GetHandlers();
for ( wxList::compatibility_iterator node = list.GetFirst(); node; node = node->GetNext() )
{
wxImageHandler *handler=(wxImageHandler*)node->GetData();
if (handler->CanRead( stream ))
return true;
}
return false;
}
int wxImage::GetImageCount( wxInputStream &stream, long type )
{
wxImageHandler *handler;
if ( type == wxBITMAP_TYPE_ANY )
{
wxList &list=GetHandlers();
for (wxList::compatibility_iterator node = list.GetFirst(); node; node = node->GetNext())
{
handler=(wxImageHandler*)node->GetData();
if ( handler->CanRead(stream) )
return handler->GetImageCount(stream);
}
wxLogWarning(_("No handler found for image type."));
return 0;
}
handler = FindHandler(type);
if ( !handler )
{
wxLogWarning(_("No image handler for type %d defined."), type);
return false;
}
if ( handler->CanRead(stream) )
{
return handler->GetImageCount(stream);
}
else
{
wxLogError(_("Image file is not of type %d."), type);
return 0;
}
}
bool wxImage::LoadFile( wxInputStream& stream, long type, int index )
{
UnRef();
m_refData = new wxImageRefData;
wxImageHandler *handler;
if ( type == wxBITMAP_TYPE_ANY )
{
wxList &list=GetHandlers();
for ( wxList::compatibility_iterator node = list.GetFirst(); node; node = node->GetNext() )
{
handler=(wxImageHandler*)node->GetData();
if ( handler->CanRead(stream) )
return handler->LoadFile(this, stream, true/*verbose*/, index);
}
wxLogWarning( _("No handler found for image type.") );
return false;
}
handler = FindHandler(type);
if (handler == 0)
{
wxLogWarning( _("No image handler for type %d defined."), type );
return false;
}
if (stream.IsSeekable() && !handler->CanRead(stream))
{
wxLogError(_("Image file is not of type %d."), type);
return false;
}
else
return handler->LoadFile(this, stream, true/*verbose*/, index);
}
bool wxImage::LoadFile( wxInputStream& stream, const wxString& mimetype, int index )
{
UnRef();
m_refData = new wxImageRefData;
wxImageHandler *handler = FindHandlerMime(mimetype);
if (handler == 0)
{
wxLogWarning( _("No image handler for type %s defined."), mimetype.GetData() );
return false;
}
if (stream.IsSeekable() && !handler->CanRead(stream))
{
wxLogError(_("Image file is not of type %s."), (const wxChar*) mimetype);
return false;
}
else
return handler->LoadFile( this, stream, true/*verbose*/, index );
}
bool wxImage::SaveFile( wxOutputStream& stream, int type ) const
{
wxCHECK_MSG( Ok(), false, wxT("invalid image") );
wxImageHandler *handler = FindHandler(type);
if ( !handler )
{
wxLogWarning( _("No image handler for type %d defined."), type );
return false;
}
return handler->SaveFile( (wxImage*)this, stream );
}
bool wxImage::SaveFile( wxOutputStream& stream, const wxString& mimetype ) const
{
wxCHECK_MSG( Ok(), false, wxT("invalid image") );
wxImageHandler *handler = FindHandlerMime(mimetype);
if ( !handler )
{
wxLogWarning( _("No image handler for type %s defined."), mimetype.GetData() );
return false;
}
return handler->SaveFile( (wxImage*)this, stream );
}
#endif // wxUSE_STREAMS
// ----------------------------------------------------------------------------
// image I/O handlers
// ----------------------------------------------------------------------------
void wxImage::AddHandler( wxImageHandler *handler )
{
// Check for an existing handler of the type being added.
if (FindHandler( handler->GetType() ) == 0)
{
sm_handlers.Append( handler );
}
else
{
// This is not documented behaviour, merely the simplest 'fix'
// for preventing duplicate additions. If someone ever has
// a good reason to add and remove duplicate handlers (and they
// may) we should probably refcount the duplicates.
// also an issue in InsertHandler below.
wxLogDebug( _T("Adding duplicate image handler for '%s'"),
handler->GetName().c_str() );
delete handler;
}
}
void wxImage::InsertHandler( wxImageHandler *handler )
{
// Check for an existing handler of the type being added.
if (FindHandler( handler->GetType() ) == 0)
{
sm_handlers.Insert( handler );
}
else
{
// see AddHandler for additional comments.
wxLogDebug( _T("Inserting duplicate image handler for '%s'"),
handler->GetName().c_str() );
delete handler;
}
}
bool wxImage::RemoveHandler( const wxString& name )
{
wxImageHandler *handler = FindHandler(name);
if (handler)
{
sm_handlers.DeleteObject(handler);
delete handler;
return true;
}
else
return false;
}
wxImageHandler *wxImage::FindHandler( const wxString& name )
{
wxList::compatibility_iterator node = sm_handlers.GetFirst();
while (node)
{
wxImageHandler *handler = (wxImageHandler*)node->GetData();
if (handler->GetName().Cmp(name) == 0) return handler;
node = node->GetNext();
}
return 0;
}
wxImageHandler *wxImage::FindHandler( const wxString& extension, long bitmapType )
{
wxList::compatibility_iterator node = sm_handlers.GetFirst();
while (node)
{
wxImageHandler *handler = (wxImageHandler*)node->GetData();
if ( (handler->GetExtension().Cmp(extension) == 0) &&
(bitmapType == -1 || handler->GetType() == bitmapType) )
return handler;
node = node->GetNext();
}
return 0;
}
wxImageHandler *wxImage::FindHandler( long bitmapType )
{
wxList::compatibility_iterator node = sm_handlers.GetFirst();
while (node)
{
wxImageHandler *handler = (wxImageHandler *)node->GetData();
if (handler->GetType() == bitmapType) return handler;
node = node->GetNext();
}
return 0;
}
wxImageHandler *wxImage::FindHandlerMime( const wxString& mimetype )
{
wxList::compatibility_iterator node = sm_handlers.GetFirst();
while (node)
{
wxImageHandler *handler = (wxImageHandler *)node->GetData();
if (handler->GetMimeType().IsSameAs(mimetype, false)) return handler;
node = node->GetNext();
}
return 0;
}
void wxImage::InitStandardHandlers()
{
#if wxUSE_STREAMS
AddHandler(new wxBMPHandler);
#endif // wxUSE_STREAMS
}
void wxImage::CleanUpHandlers()
{
wxList::compatibility_iterator node = sm_handlers.GetFirst();
while (node)
{
wxImageHandler *handler = (wxImageHandler *)node->GetData();
wxList::compatibility_iterator next = node->GetNext();
delete handler;
node = next;
}
sm_handlers.Clear();
}
wxString wxImage::GetImageExtWildcard()
{
wxString fmts;
wxList& Handlers = wxImage::GetHandlers();
wxList::compatibility_iterator Node = Handlers.GetFirst();
while ( Node )
{
wxImageHandler* Handler = (wxImageHandler*)Node->GetData();
fmts += wxT("*.") + Handler->GetExtension();
Node = Node->GetNext();
if ( Node ) fmts += wxT(";");
}
return wxT("(") + fmts + wxT(")|") + fmts;
}
wxImage::HSVValue wxImage::RGBtoHSV(const RGBValue& rgb)
{
double hue, saturation, value;
const double red = rgb.red / 255.0,
green = rgb.green / 255.0,
blue = rgb.blue / 255.0;
double minimumRGB = red;
if (green < minimumRGB)
minimumRGB = green;
if (blue < minimumRGB)
minimumRGB = blue;
double maximumRGB = red;
if (green > maximumRGB)
maximumRGB = green;
if (blue > maximumRGB)
maximumRGB = blue;
value = maximumRGB;
if (maximumRGB == minimumRGB)
{
// Gray has no color
hue = 0.0;
saturation = 0.0;
}
else
{
double deltaRGB = maximumRGB - minimumRGB;
saturation = deltaRGB / maximumRGB;
if ( red == maximumRGB )
hue = (green - blue) / deltaRGB;
else if (green == maximumRGB)
hue = 2.0 + (blue - red) / deltaRGB;
else
hue = 4.0 + (red - green) / deltaRGB;
hue = hue / 6.0;
if (hue < 0.0)
hue = hue + 1.0;
}
return HSVValue(hue, saturation, value);
}
wxImage::RGBValue wxImage::HSVtoRGB(const HSVValue& hsv)
{
double red, green, blue;
if ( hsv.saturation == 0.0 )
{
red = hsv.value; //Grey
green = hsv.value;
blue = hsv.value;
}
else
{
double hue = hsv.hue * 6.0; // sector 0 to 5
int i = (int)floor(hue);
double f = hue - i; // fractional part of h
double p = hsv.value * (1.0 - hsv.saturation);
switch (i)
{
case 0:
red = hsv.value;
green = hsv.value * (1.0 - hsv.saturation * (1.0 - f));
blue = p;
break;
case 1:
red = hsv.value * (1.0 - hsv.saturation * f);
green = hsv.value;
blue = p;
break;
case 2:
red = p;
green = hsv.value;
blue = hsv.value * (1.0 - hsv.saturation * (1.0 - f));
break;
case 3:
red = p;
green = hsv.value * (1.0 - hsv.saturation * f);
blue = hsv.value;
break;
case 4:
red = hsv.value * (1.0 - hsv.saturation * (1.0 - f));
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -